File_path 1
My_lily_lexer 1
-PCol 1
-Score_column 1
-Script_column 1
-# E l b e ment? search/replace typo
+PCol 0
+Score_column 0
+Script_column 0
+# E l b e ment? search/replace typo.
+# Yeah. kind of. Looks cute though
Elbement_group 1
Ineq_constrained_qp 1
Spacing_problem 1
Colinfo 1
Mixed_qp 1
PScore 1
-Idealspacing 1
+Idealspacing 0
# yydebug
InitParser 1
Music 1
Paper_def 1
Lookup 1
-Input_translator 1
+Input_translator 0
Score_elem 1
Item 1
Note_head 1
Engraver 1
-Score_engraver 1
-Staff_engravers 1
+Rest_collision_engraver 1
+Score_engraver 0
Engraver_group_engraver 1
-Input_cursor 1
-Commands_at 1
-Input_command 1
Time_description 1
Melodic_req 1
-Midi_walker 1
+Midi_def 1
Note_performer 0
Performer 0
Stem_req 1
Colinfo 1
Word_wrap 1
Text_req 1
-Script_def 1
-Text_def 1
+Script_def 0
+Text_def 0
Paperdef 1
Symtable 1
Symtables 1
+Beam 1
+Head_column 1
TOPLEVEL_MAJOR_VERSION = 0
TOPLEVEL_MINOR_VERSION = 0
-TOPLEVEL_PATCH_LEVEL = 75
+TOPLEVEL_PATCH_LEVEL = 76
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-TOPLEVEL_MY_PATCH_LEVEL = .jcn6
+TOPLEVEL_MY_PATCH_LEVEL =
-
We are proud to announce the birth of "GNU LilyPond 0.1", a.k.a.
- Lily
+ Lily 0.1
- born .. 1997
+ born August 1, 1997
daughter to Jan 'Janneke' Nieuwenhuizen and Han-Wen 'Wendy'
Nienhuys
-Lily is a healthy, bouncing baby weighing 345 kilobytes
+Lily is a healthy, bouncing baby weighing 335 kilobytes
Visiting hours: 24hrs a day at
- ftp://pcnov095.win.tue.nl,
+ ftp://pcnov095.win.tue.nl/pub/lilypond/lilypond-0.1.tar.gz
+ ftp://prep.gnu.ai.mit.edu/pub/gnu/lilypond-0.1.tar.gz
you can see some babyfood, diapers and pictures at
You can send your congratulations to Janneke (jan@digicash.com) and
Wendy (hanwen@stack.nl)
- --- * ---
-
- We would like to dedicate this program to all the friends that we
- met through music.
-
-
- Those deserving special mention (in no particular order):
-Esther, Marijke, Heike, Inge, Judith, Hannah, Auke, Ilse, Evelyn,
-Maartje, Suzanne, Ilse (gee, again?) and last (but certainly not least)
-Janneke!
-
- HWN
-
- That's a nice thought, Wendy. I've got a few too, to spread
-the credits a bit (Again, no particular order) Michelle, Illushka,
-Ruth, Eva, Fro/ydis, Monique, Noor, Sascha, Monique, Ilse, Monique,
-Eva, Roos, Judith, and, of course, Wendy!
-
- JCN
-
-
-Of course, our other friends in the `Eindhovens Jongeren Ensemble'
-(http://www.stack.nl/~hanwen/eje.html) cannot go unmentioned too.
-
-
- --- * ---
[ And now the serious part ]
http://www.stack.nl/~hanwen/lilypond/index.html
-(it is somewhat lousy, but I have more important things to do).
+It isn't flashy, but then I wasn't born to be a webartist.
[DETAILED DESCRIPTION]
-WHAT IS GNU LilyPond
+WHAT IS GNU LilyPond?
+
+GNU LilyPond which converts music definition files into visual or
+audio output: it can typeset formatted sheet music to a TeX file and
+and (mechanical) performances to MIDI files.
+
+WHY?
-Technically it is a preprocessor which generates TeX
-(or LaTeX) output which contains information to typeset a musical
-score. Practically it is a typesetter, which only uses TeX as an
-output medium. (this is handy because there exist music fonts for TeX)
+We want to create tools which can produce production quality scores
+and parts of public music. We haven't quite reached that goal:
-As a bonus, you can also output a MIDI file of what you typed.
+* The quality of the output isn't good enough yet due to
+some (still) insophisticated algorithms
-The input is a script file which is read. The script file is a "music
-definition", ie, you type the melody as if it is read out loud
+* A number of features haven't been implemented (although they can be
+quite simple)
+
+We Want You! You can become a user, but we'd really appreciate to
+have some Hackers to help advance our project more quickly.
WHAT IS NEEDED?
for running you need
TeX
+ MusiXTeX fonts
+
+The MusiXTeX fonts are part of the MusiXTeX package version T.73,
+available at http://www.gmd.de/Misc/Music/
-FEATURES
+WHAT CAN LILYPOND DO?
ASCII script input (mudela), with identifiers (for music reuse),
customizable notenames
MIDI to Mudela conversion through the mi2mu program.
Multiple staffs in one score. Each staff can have a different meters.
-Multiple voices within one staff; beams optionally shared between
-voices. Multiple scores within one input file. Each score is output
-to a different file.
+Multiple voices within one staff (up to four handled graciously);
+beams optionally shared between voices. Multiple scores within one
+input file. Each score is output to a different file.
Beams, slurs, chords, super/subscripts (accents and text),
general n-plet (triplet, quadruplets, etc.), lyrics, transposition
-dynamics (both absolute and hairpin style) clef changes, meter
+dynamics (both absolute and hairpin style), clef changes, meter
changes, cadenza-mode, key changes, repeat bars
-[Kudos to the FSF, all Linux hackers, and --of course-- especially
-GrandMaster Linus T, for The Kernel and The Announce :-]
+Integration with LaTeX through scripts.
+
+
- Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
make/*.make, */Makefile parts of
Documentation/mudela.pod, lib/*source-file*,
lib/duration.cc, lib/source, flower/*{list,cursor}*,
- lily/rest-collision*, conflily, cygnus w32 stuff
+ lily/rest-collision*, conflily, cygnus w32 stuff,
+ lily/*perf*
and corresponding header files.
+\bo Werner Lemberg <xlwy01@uxp1.hrz.uni-dortmund.de>, misc
bugfixes, some Beam and Stem code.
+ Your name could be here! If you want to help, then take a
+ look at the SMALLISH PROJECTS section of in the file _\bT_\bO_\bD_\bO.
+ Some do not involve coding C++
-
-
-
-
-7/Jul/97 LilyPond 0.0.74 1
+26/Jul/97 LilyPond 0.0.76 1
+
+[document reintroduced deficiencies.]
This license applies to all files except:
- the included input files which explicitly state a different
-copyright
-
- - the MetaFont sources, found in the subdirectory mf/. See
-mf/README.
+copyright policy
GNU GENERAL PUBLIC LICENSE
--- /dev/null
+
+ --- * ---
+
+ We would like to dedicate this program to all the friends that we
+ met through music.
+
+
+ Those deserving special mention (in no particular order):
+Esther, Marijke, Heike, Inge, Judith, Hannah, Auke, Ilse, Evelyn,
+Maartje, Suzanne, Ilse (gee, again?) and last (but certainly not least)
+Janneke!
+
+ HWN
+
+ That's a nice thought, Wendy. I've got a few too, to spread
+the credits a bit (Again, no particular order) Michelle, Illushka,
+Ruth, Eva, Fro/ydis, Monique, Noor, Sascha, Monique, Ilse, Monique,
+Eva, Roos, Judith, and, of course, Wendy!
+
+ JCN
+
+
+Of course, our other friends in the `Eindhovens Jongeren Ensemble'
+(http://www.stack.nl/~hanwen/eje.html) cannot go unmentioned either.
+
+
+ --- * ---
lily/midi-*, mi2mu/*, parts flower/string*.cc, make/*.make, */Makefile
parts of Documentation/mudela.pod, lib/*source-file*, lib/duration.cc,
lib/source, flower/*{list,cursor}*, lily/rest-collision*, conflily,
-cygnus w32 stuff
+cygnus w32 stuff, lily/*perf*
and corresponding header files.
=back
+Your name could be here! If you want to help, then take a look at the
+SMALLISH PROJECTS section of in the file F<TODO>. Some do not involve
+coding C++
+
+
=head2 Quote:
A program should be light and agile, its subroutines
-connected like a strings of pearls. The spirit and intent of
+connected like a string of pearls. The spirit and intent of
the program should be retained throughout. There should be
neither too little nor too much, neither needless loops nor
useless variables, neither lack of structure nor overwhelming
Definitions of classes that are only accessed via pointers
(*) or references (&) shall not be included as include files.
-Include files in C++ always have the file name extension ".hh".
+filenames
-Implementation files in C++ always have the file name
-extension ".cc".
-
-Inline definition files always have the file name extension ".icc".
+ ".hh" Include files
+ ".cc" Implementation files
+ ".icc" Inline definition files
+ ".tcc" non inline Template defs
in emacs:
auto-mode-alist))
+The class Class_name_abbreviation is coded in F<class-name-abbr.*>
+
=head2 INDENTATION
Unfortunately most of the code isn't really documented that good.
-=head2 CLASSNAMES (2)
-
-A lot of classes in GNU LilyPond start with 'P', this is to distinguish
-certain parts of GNU LilyPond: the P stands for Printer, and the P-classes
-are supposed to be more lowlevel than the others. Example:
-
-Staff uses PStaff, PScore and PCol to do the typesetting of
-symbols. Staff is the "brains" for PStaff
-
-NB: in PCursor (which is part of the library) P stands for PointerCursor
-
-
=head2 MEMBERS (2)
Standard methods:
This page documents installation and compilation of GNU LilyPond
-=head1 IMPORTANT
-
-if you have downloaded a
-
- *.pre*
-
-version, then this is version is I<not> meant for producing nice
-output, but to keep your patchsets up to date. It might not even compile.
-
=head1 PREREQUISITES
For compilation you need.
=back
+=head1 RUNNING
+
+GNU LilyPond does use a lot of resources. For operation you need the following:
+
+
+=over 5
+
+=item *
+
+TeX
+
+=item *
+
+The MusixTeX fonts (I included those found in MusixTeX T.73). Beware,
+the clef symbol seems to have changed its position in some versions,
+(notably Egler's, a.k.a. OpusTeX). The MusixTeX fonts are included in
+MusixTeX T.73, which can be had from any CTAN site, eg at
+
+ ftp://ftp.shsu.edu/tex-archive/macros/musixtex/taupin
+ ftp://ftp.tex.ac.uk/tex-archive/macros/musixtex/taupin
+ ftp://ftp.dante.de/tex-archive/macros/musixtex/taupin
+
+You only need the contents of the F<mf/> subdirectory of the package.
+
=head1 RECOMMENDED
+Although not strictly necessary, these are recommended to have.
+
=over 5
=item *
(GNU) find
+
+=item *
+
+A fast computer (a full page of music typically takes 1 minute
+on my 486/133, using the B<--enable-checking> compile. It's lot slower
+than most MusiXTeX preprocessors)
+
=back
+
=head1 CONFIGURING and COMPILING
to install GNU LilyPond, simply type:
/usr/local/bin/mi2mu
/usr/local/share/lilypond/*
/usr/lib/texmf/texmf/tex/lilypond/*
- /usr/lib/texmf/texmf/fonts/source/lilypond/*
The TeX include directory is detected dynamically, but it can be
adjusted with B<--enable-tex-prefix> and B<--enable-tex-dir>. The
configure --prefix=/home/me_myself_and_I/
-In this case, you will have to set MFINPUTS, and TEINPUTS accordingly.
+In this case, you will have to set MFINPUTS, and TEXINPUTS accordingly.
If you want to install GNU LilyPond in F</usr/local>, and your TeX has
no default hooks for local stuff (mine is broken too), you can do:
=item --enable-mf-dir
-Set then directory tex input is in (idem)
+Set then directory mf input is in (idem)
=back
should do the trick.
-[todo. Obsolete; fonts are in distribution now.]
-
Install the musixtex fonts in a directory which TeX and MF knows (if
you are root, look for a directory which contains the directories with
AMS and CM source (*.mf) files. Create a subdir lilypond or musixtex
Example: my fonts are in F</usr/local/lib/texfonts/musixtex/>, and I
have a symlink pointing to that in
-F</usr/lib/texmf/texmf/fonts/source/public/>
+F</usr/lib/texmf/texmf/fonts/source/public/>. After I copied the
+files, I ran "texhash"
+
+ftp://hprib.lps.u-psud.fr/pub/music_zips/musixtex.zip
=head1 CAVEATS
=back
-=head1 RUNNING
-
-GNU LilyPond does use a lot of resources. For operation you need the following:
-
+=head1 EXAMPLE
-=over 5
-
-=item *
-
-A fast computer (a full page of music typically takes 1 minute
-on my 486/66, using the B<--enable-checking> compile. It's lot slower
-than most MusiXTeX preprocessors)
-
-=item *
-
-TeX
-
-=item *
-
-The MusixTeX fonts (I included those found in MusixTeX T.73). Beware,
-the clef symbol has changed position in the Egler version,
-a.k.a. OpusTeX)
-
-=back
-
-At this time, GNU LilyPond output looks nice, but is not of production
-quality. If you're not discouraged; this is what I type in my xterm:
+This is what I type in my xterm:
lilypond someinput.ly
tex lelie.tex
=head1 REDHAT LINUX
RedHat Linux users should be able to get a RPM. A spec file is in
-F<make/lilypond.spec>. You should be able to create an rpm as a normal
+F<make/out/lilypond.spec>. You should be able to create an rpm as a normal
user. Be sure you have a ~/.rpmrc, and edit the RPM-dir in
-F<Variables.make>
+F<Variables.make>. (If you create the RPM as a normal user the
+permissions will not be set correctly, unfortunately)
=head1 WINDOZE
bash configure
make windows32
-=head1 PLATFORMS
-
-GNU LilyPond (pl 0.0.39) is known to compile on the following platforms:
-
-Unix:
-
- * gnu/linux 2.0.x, g++ 2.7.2[.1]
- * aix 4.1, g++ 2.7.2
- * solaris 2.5, g++ 2.7.2
-
-Other:
-
- * windows-nt 4.0, cygnus gnu-windows32 beta17.1 (~=g++ 2.7.2)
- * gnu/linux 2.0.28 X to doze, gcc-go32 (~=g++ 2.7.2) [exec. untested]
-
=head1 AUTHORS
Han-Wen Nienhuys <hanwen@stack.nl>
=item *
-GNU LilyPond does not display notes directly, nor will it be rehacked to be
-used interactively. GNU LilyPond writes output to a file. It will not be
-extended to play music, or to recognize music.
+GNU LilyPond does not display notes directly, nor will it be rehacked
+to be used interactively. GNU LilyPond writes output to a file. It
+will not be extended to play music, or to recognize music.
+
+[As an aside, I am contemplating to create a library for rendering
+music, which is "X-capable", so that others can create interactive tools]
=item *
=item *
GNU LilyPond is free. Commercial windows packages for setting music are
-abundant. Free musicprinting software is scarce.
+abundant. Free musicprinting software is scarce. For more thoughts on
+this, please consult the F<gnu-music> documentation.
=item *
=item *
-be easily writable in ASCII with a simple texteditor, yfte(TM).
+be easily writable in ASCII with a simple texteditor
=back
=item *
-provide simple musical manipulations, such as
-S<(i) extracting> a slice of music from a previously defined piece,
-S<(ii) extracting> only the rhythm from a piece of music,
-S<(iii) transposing>, etc.,
+provide simple musical manipulations, such as S<(i) extracting> a
+slice of music from a previously defined piece, S<(ii) extracting>
+only the rhythm from a piece of music, S<(iii) transposing>, etc.,
=item *
=item *
-Mahlerian orchestral scores,
+Orchestral scores, (eg Mahler)
=item *
-piano pieces (Schubertian, Rachmaninovian),
+piano pieces (eg. Schubert, Rachmaninov),
=item *
=item *
-gregorian chants,
+Gregorian chants,
=item *
#
#
-
+DOCFILES = $(wildcard *.doc)
OUTPODFILES = $(addprefix $(outdir)/,$(PODFILES))
TEXTFILES = $(OUTPODFILES:.pod=.text)
GROFFFILES = $(OUTPODFILES:.pod=.1)
HTMLFILES = $(OUTPODFILES:.pod=.html)
-#
+DVIFILES = $(addprefix $(outdir)/, $(DOCFILES:.doc=.dvi))
-# list of distribution files:
#
-EXTRA_DISTFILES = lelie_icon.gif lelie_logo.gif
+# list of distribution files:
#
-
+EXTRA_DISTFILES = lelie_icon.gif lelie_logo.gif $(DOCFILES)
default: do-doc
- true
-do-doc: $(TEXTFILES)
+do-doc: $(TEXTFILES) $(DVIFILES)
html: $(HTMLFILES)
rm -f out/*
rm -f $(TEXTFILES) $(HTMLFILES) $(GROFFFILES)
-MAN1FILES = lilypond convert-mudela mi2mu
+MAN1FILES = lilypond convert-mudela mi2mu mudela-book
MAN1GROFF = $(addprefix $(outdir)/, $(addsuffix .1,$(MAN1FILES)))
localinstall: $(outdir)/lilypond.1 $(outdir)/mudela.5
$(INSTALL) -d $(mandir)/man5
$(INSTALL) -d $(mandir)/man1
$(INSTALL) -m 755 $(MAN1GROFF) $(mandir)/man1
- $(INSTALL) -m 755 $(outdir)/mudela.5 $(mandir)/man5
+
localuninstall:
- rm -f $(mandir)/man1/lilypond.1
- rm -f $(mandir)/man1/convert-mudela.1
+ (cd $(mandir)/man1/; rm -f $(MAN1GROFF))
+
+
-xpms:
A: LilyPond uses features of bison version 1.25. Please confirm that
you are using a version 1.25 or better. Don't forget to do "make
-clean" after installing it
+clean" after installing it. Don't forget to remove the stale
+bison.simple as well.
If the problem persists, then please mail me.
a()a()a
-Q: Why shouldn't I put all commands (\clef, \meter) inside the music?
-
-A: You should do what you like, but at some time we will enable
-quoting of music ("Stichnoten"). Besides if you are going to type an
-orchestral score, then you'd probably want to enter most of the meter,
-repeat commands only once.
-
Q: I want to insert some TeX commands
A: You shouldn't: it's against LilyPond philosophy to have typesetting
A: By using g++, GNU LilyPond is portable to all platforms which support
g++ (there are quite a few). Not having to support other compilers
-saves us a I<lot> of trouble. GNU LilyPond and FlowerLib use:
-
-=over 4
-
-=item *
-
-builtin bool
-
-=item *
-
-64 bit integral type long long
-
-=item *
-
-typeof
-
-=item *
-
-operator <?, operator >?
-
-=item *
-
-the new for-scope
-
-=item *
-
-class Rational (libg++)
-
-=back
+saves us a I<lot> of trouble.
=head2 Running
=head1 DESCRIPTION
-Random ranting about the GNU Music project
+Random ranting about the GNU Music project.
+
+=head2 Note
+
+The GNU Music project was started by a few people (among others Robert Strandh,
+Robert.Strandh@labri.u-bordeaux.fr), who wanted to create free software
+for music printing and composing. After its initiation, its
+development efforts slowed down.
+
+Independently, I started LilyPond. When I showed it to
+RMS, he was very enthousiastic about having LilyPond in the GNU
+project. I subsequently learned about the GNU Music project, and
+contacted them. We (the GNU Music project people and us, LilyPond
+people) agreed that cooperation would be desirable. Although merging
+of both efforts is technically infeasible at this point, we did decide
+that LilyPond should also be part of the GNU Music project (when it is
+really released).
+
+In summary, LilyPond is part of the GNU project, and part of the (yet
+to be created) GNU Music project. LilyPond 's existence does not mean
+that other efforts for free music tools have come to a halt. In
+particular, the following document is entirely mine, and is not meant
+to reflect anyone else's opinion.
=head1 GOAL
=item easy to use.
That is, for technical users (that can read a manual). The learning
-curve should be as easy as possible but not at the expense of comfort
+curve should be as flat as possible but not at the expense of comfort
of use and power.
=back
=item A set of music fonts
Preferably in Metafont, suited to both screen display and use on
-paper; This is because the copyright heritage of {Opus,Musix}tex is unclear.
+paper; This is needed because
+
+1. the copyright heritage of
+{Opus,Musix}tex is unclear.
+
+2. We don't have any legal papers which make these fonts free (to use
+and alter)
=item A typesetting engine
A system with rules on how to set properties of items to be printed
-(up/down directions, breaking, etc) LilyPond provides one, but it is
-not yet suited to interactive typesetting
+(up/down directions, breaking, dimensoins, etc) LilyPond provides one,
+but it is not (yet) suited to interactive typesetting
=item A display engine
which can display clear notewriting in (say) an X-window
-Gsharp is there, but far from finished. Ideally the system should
+G-Sharp is there, but far from finished. Ideally the system should
cooperate with the typesetting engine
=item An ASCII language
(difficult) A system to generate accompaniments, figured bass,
automatic accompaniment, etc.
-=item an internet archive of free music
+=item An internet archive of free music
The complete works by Bach, Beethoven, and any other ancient composer
should be electronically retrievable. This might be a separate
As a bonus, you can also output a MIDI file of what you typed.
+=head2 Examples
+
+
<a href=example_output.html
>
examples of what LilyPond can do: MIDI, PS, .gif and input.
</a
>
-=head1 DOCUMENTATION
+=head2 Documentation
=over 4
+=item *
+<a href=faq.html
+>
+FAQs
+</a
+>
=item *
<a href=INSTALL.html
>
=item *
-<a href=MANIFESTO.html
+<a href=tex_manuals.html
>
-Design criteria
+PS documents about LilyPond
</a
>
+
=item *
-<a href=AUTHORS.html
+<a href=mi2mu.html
>
-AUTHORS
+manual page for mi2mu, the MIDI convertor.
</a
>
-
=item *
<a href=lilypond.html
>
>
=item *
-<a href=lilygut.html
+<a href=convert-mudela.html
>
-internal structures.
+The mudela convertor: convert-mudela
</a
>
=item *
-<a href=lilyliterature.html
+<a href=mudela-book.html
>
-Papers, books and online-resources on music typesetting
+mudela in TeX: mudela-book
</a
>
=item *
-<a href=other-packages.html
+<a href=error.html
>
-Other packages for printing music.
+errors
</a
>
+
+=back
+
+=head2 Background information
+
+=over 4
+
=item *
-<a href=mi2mu.html
+<a href=MANIFESTO.html
>
-manual page for mi2mu, the MIDI convertor.
+Design criteria
</a
>
=item *
-<a href=mudela.html
+<a href=lelieblond.gif
>
-Mudela, the input format
+The lilypond logo (Big, format: .gif)
</a
>
=item *
-<a href=convert-mudela.html
+<a href=lelie_logo.gif
>
-The mudela convertor: convert-mudela
+The lilypond logo (medium size, format: .gif)
</a
>
=item *
-<a href=faq.html
+<a href=gnu-music.html
>
-FAQs
+The GNU Music project
</a
>
+=back
+
+
+=head2 The program
+
+
+=over 5
+
+
=item *
-<a href=error.html
+<a href=TODO.txt
>
-errors
+The TODO list.
</a
>
=item *
-<a href=lelieblond.gif
+<a href=NEWS.txt
>
-The lilypond logo (Big, format: .gif)
+The Change log
</a
>
=item *
-<a href=lelie_logo.gif
+<a href=lilygut.html
>
-The lilypond logo (medium size, format: .gif)
+internal structures.
</a
>
-
=item *
-<a href=TODO.txt
+<a href=CodingStyle.html
>
-The TODO list.
+The coding standards of the lilypond project.
</a
>
=item *
-<a href=NEWS.txt
+<a href=docxx/index.html
>
-The Change log
+The DOC++ documentation of the C++ sources.
</a
>
=item *
-<a href=CodingStyle.html
+<a href=AUTHORS.html
>
-The coding standards of the lilypond project.
+AUTHORS
</a
>
+=back
+
+=head2 Links
+
+=over 5
+
=item *
-<a href=gnu-music.html
+<a href=lilyliterature.html
>
-The GNU Music project
+Papers, books and online-resources on music typesetting
</a
>
=item *
-<a href=docxx/index.html
+<a href=other-packages.html
>
-The DOC++ documentation of the C++ sources.
+Other packages for printing music.
</a
>
-
=item *
-Get it at ftp://pcnov095.win.tue.nl/pub/lilypond !
+Get LilyPond at ftp://pcnov095.win.tue.nl/pub/lilypond !
=item *
=head1 REQUIREMENTS
-=head2 Parser output
-
-When I say LilyPond input, I mean the final output of the parsing
-step, which should be roughly the same as it is now: hierarchically,
-using pseudo syntax
-
- Score {
- Midi_def
- Paper_def
- Staff [multiple] {
- Voices
- Stafftype
- (instrument)
- }
- }
-
-
-Voice should stay the same:
-
- Voice {
- Voice_elements
- }
-
-and
-
- Voice_elements {
- requests
- }
-
-
-=head2 Staffs
-
-We definitely need the concept of staff in the parser output, because
-it is fundamental to LilyPond. I think the input language should
-allow the user to do something like:
-
- melody = { c d e f g }
-
- %At this time I can't think of more than these stafftypes
- staff { gregorian music { melody } }
- staff { pianostaff music { melody } }
- staff { melodic music { melody } }
- staff { rhythmic music { melody } }
- staff { lyric music { melody } } % silly, i admit.
-
-The staff could also define what the instrument would be (both in
-print and in MIDI)
-
-Moreover, if music {} in score equals staff, then how do we do multiple
-voices on one staff?
-
-We might be able to do without the staff{} construct, but I doubt if
-it will make things easier.
-
=head1 CONCRETE PROPOSALS
=head2 Requests
I want to give the user some access to the internals. Technically,
-walkers/registers will happily typeset voices which mix lyrics and
+engravers/performers will happily typeset voices which mix lyrics and
notes, which combine stem requests and lyricreqs. I want to have a
\request { melodic name = 5, acc = -10
type of syntax. This is the most flexible input format possible, since
any valid LilyPond input can be made. This strongly implies tying
mudela to LilyPond. That I don't mind, but it hampers
-portability. Suppose some commercial systems want to read mudela
-too.
-
+portability. Suppose some commercial systems want to read mudela too.
=head2 Command placement:
Just ideas:
|| && ! filter syntax
- ++ concatenation of voices
+ merging of voices
=head2 Quoting
This should become a Hacking-HOWTO. If you find any confusing stuff
here, let me know. I am a hacker, and don't spend enough time doccing
-what I write.
+what I write. (Most stuff here which refers to the code is slightly outdated)
If you finally have mastered some internal piece of lily, your
explanation could be added here.
different elements.
In this step data-structures for the next steps are created and filled
-with data: PScore, PCol.
+with data: Score_elements, PScore, PCol.
+
+=item Prebreaking
+
+Breakable stuff (eg. clefs and bars) are copied into pre and postbreaks.
=item Preprocessing
Some dependencies are resolved, such as the direction of stems, beams,
-=item Calculation:
+=item Break calculation:
+
+The lines and horizontal positions of the columns are determined
+
+=item Breaking
-This step uses structures which have names starting with 'P'.
-linebreaks and horizontal positions of PCols are determined.
Through some magical interactions with Line_of_score and Super_elem
(check out the source) the "lines" are produced.
=item Output paper
-Very simple, just walk all Line_of_* and follow the links over there
=item Output midi
-The columns of requests (from the Setting up step) are used to
-determine what to output when.
+The music is run through a translator (called Performer) which
+creates midi-items from the requests.
=back
on the paper than actually fits. To reflect this idea (the user asks
more than we can do), the container for this data is called Request.
-A request is done to the C<Staff> which contains the
-C<Voice_element>. The staff decides whether to to honor the request,
-ignore it, or merge it with other requests. Merging of requests is
-preferably done with other requests done by members of the same
-voicegroups (beams, brackets, stems)
+The music (requests) are read/interpreted by a set of objects
+(translators), the Performers/Engravers. The engraver which agrees to
+handle a request decides whether to to honor the request, ignore it,
+or merge it with other requests. Merging of requests is preferably
+done with other requests done by members of the same voicegroups
+(beams, brackets, stems).
The result of a request will be an C<Item> or a C<Spanner>, which
-will be put on a C<PStaff>. Note that the C<PStaff> and the original
-C<Staff> need not have anything in common. For example, the
-``double'' piano Staff could interpret commands which juggle
-melodies across the left and right hand, and may put the result in
-two five-line PStaffs (maybe with extra PStaffs to carry the dynamic
-signs and any lyric.
-
-The class C<Staff> should be thought as a container for the
-C<Voice>s, and an interpreter for C<Request>s.
+will be put on the score.
+
Different staffs can produce different outputs; a melodious voice
which is put into a percussion-Staff, will be typeset as the rythm of
that voice.
=item C<Note_req>
-Staff has to decide if the ball should be hanging left or right. This
-influences the horizontal dimensions of a column, and this is why
-request processing should be done before horizontal spacing.
+LilyPond has to decide if the ball should be hanging left or
+right. This influences the horizontal dimensions of a column, and this
+is why request processing should be done before horizontal spacing.
Other voices' frivolities may cause the need for accidentals, so this
-is also for the C<Staff> to decide. The C<Staff> can decide on positioning
-based on ottava commands and the appropriate clef.
+is also for the to decide. The engraver can decide on positioning based on
+ottava commands and the appropriate clef.
=item C<Rest_req>
Start/stop a beam.
-Staff has to combine this request with the stem_request, since the
+Engraver has to combine this request with the stem_request, since the
number of flags that a stem wants to carry will determine the
number of beams.
should be merged. The slurs OTOH are specific for each voice, so they
should not be shared.
-The judge in this "allocation" problem is Staff (actually, it's child
-C<Complex_staff>). It uses the C<Request_engraver> to do most of the
-work. For each request C<Complex_staff> queries so-called
-C<Request_engraver>s if they want to accept a request eg, the
-C<Notehead_engraver> will accept C<Note_req>s, and turn down
-C<Slur_req>s. If C<Complex_staff> cannot find a engraver that wants
-the request, it is junked (with a warning message).
+The judge in this "allocation" problem a set of broker. It uses the
+C<Request_engraver> to do most of the work. For each request
+C<Complex_staff> queries so-called C<Request_engraver>s if they want
+to accept a request eg, the C<Notehead_engraver> will accept
+C<Note_req>s, and turn down C<Slur_req>s. If the Music_iterator
+cannot find a engraver that wants the request, it is junked (with a
+warning message).
After all requests have been either assigned, or junked, the Engraver
will process the requests (which usually means creating an C<Item> or
C<Spanner>). If a C<Request_engraver> creates something, it tells
-C<Complex_staff>. If all requests have been processed, then each
-Engraver is notified of any created Staff_element.
+If all requests have been processed, then each Engraver is notified
+of any created Score_element, via a broadcasting system.
=head2 example:
note_request will be taken by a C<Notehead_engraver>, stem_request
will be taken by a C<Stem_beam_engraver>. C<Notehead_engraver> creates
a C<Notehead>, C<Stem_beam_engraver> creates a C<Stem>. Both announce
-this to the Staff. Staff will tell C<Stem_beam_engraver> about the
-C<Notehead>, which will add the C<Notehead> to the C<Stem> it just
-created.
+this to the Staff_engraver. Staff_engraver will tell
+C<Stem_beam_engraver> about the C<Notehead>, which will add the
+C<Notehead> to the C<Stem> it just created.
To decide on merging, C<Complex_staff> has grouped several
-engravers. There are a few groups:
-
-=over 4
-
-=item *
-
-Staff wide, contains
-
- Local_key_engraver
- Bar_engraver
- Key_engraver
- Meter_engraver
- Clef_engraver
+engravers. Please check init/engraver.ini.
-=item *
-
-Voice group, contains
-
- Stem_beam_engraver
- Script_engraver
- Text_engraver
-
-=item *
-
-Voice, contains
-
- Slur_engraver
- Notehead_engraver
-
-=back
=head1 ITEMS and SPANNERS
minimum distance to other columns, to prevent symbols from running
into symbols of other columns.)
+
+=head1 SPACING 2
+
+
This of course does not solve the problem of generating the
springs. This is an area that needs a lot of work, and the optimal
solution to find is not of a mathematical nature.
-
+Gourlay's solution is used.
A list of resources on music printing/writing and engraving. Please
note that don't have access to most material.
-[What I do know, I've commented inside brackets. They are just my
-personal comments, not to be taken too seriously]
+[Personal comments appear in brackets. What I (HWN) know, I've
+commented myself. They are just my personal comments, not to be taken
+too seriously]
=head2 Music engraving: references
OSU-CISRC-10/87-TR35, Department of Computer and Information Science,
The Ohio State University, 1987.
-[Algorithm to generate spacing in polyphonic music, tailored for use
-with MusiCopy HWN]
+[Algorithm for generating spacing in one line of (polyphonic) music,
+tailored for use with MusiCopy. LilyPond uses a variant of it (as of
+pl 76) HWN]
Allen Parish, Wael A. Hegazy, John S. Gourlay, Dean K. Roush and
F. Javier Sola. ``MusiCopy: An automated Music Formatting System''.
universiteit Rotterdam, 1991. (``An automated system for printing
music'' Master's Thesis Managerial Computer Science.)
-[This thesis describes a simplistic (monophonic) typesetting system,
+[This dutch thesis describes a simplistic (monophonic) typesetting system,
and focuses on the breaking algorithm, which is taken from Hegazy &
Gourlay HWN]
[Specs for NIFF, a comprehensive but binary (yuk) format for notation HWN]
-Alexander Brinkman, ``PASCAL Programming for Music Research''. The
-University of Chicago Press, 1990.
-
=head1 AUTHORS
-References contributed by Han-Wen Nienhuys, Miguel Filgueiras, Mark
-Basinski, Dorothea Blostein, Stephen Page, Jan Nieuwenhuizen.
+References and comments contributed by Han-Wen Nienhuys (HWN), Miguel
+Filgueiras, Mark Basinski (MB), Dorothea Blostein, Stephen Page (SP),
+Jan Nieuwenhuizen.
This should really be redone in BibTeX
=head1 DESCRIPTION
-Technically GNU LilyPond is a preprocessor which generates TeX
-(or LaTeX) output which contains information to typeset a musical
-score. Practically it is a typesetter, which only uses TeX as an
-output medium. (this is handy because there exist music fonts for TeX)
-
-As a bonus, you can also output a MIDI file of what you typed.
-
-It translates script files (mudela files or F<*.ly>'s) into TeX input.
-Typesetting music is a complex task, whereas the message that printed
-music conveys is usually a simple one. GNU LilyPond is a try at providing
-a simple interface for setting music.
+GNU LilyPond which converts music definition files into visual or
+audio output: it can produce formatted sheet music in TeX and
+and mechanical perfomances to MIDI files.
=head1 OPTIONS
=item *
-multiple stafftypes (melodic, rhythmic) [broken from pl28 on]
-
-=item *
-
beams, slurs, ties, chords, super/subscripts (accents and text),
triplets, general n-plet (triplet, quadruplets, etc.), lyrics,
transposition dynamics (both absolute and hairpin style)
Han-Wen Nienhuys <hanwen@stack.nl>, http://www.stack.nl/~hanwen
-Main author
-
=item *
Jan Nieuwenhuizen <jan@digicash.com>, http://www.digicash.com/~jan.
-Context errors, Lyrics, mi2mu, MIDI stuff, make structure, bits of
-FlowerLib, general comments, Mudela design.
-
=back
-Your name could be here! If you want to help, then take a look at the
-SMALLISH PROJECTS section of in the file F<TODO>. Some do not involve
-coding C++
-
-=head1 EXAMPLES
-
=head1 PROBLEMS
=item *
-if the bug has been found earlier, consult F<TODO>
+if the bug has been found earlier, consult F<TODO> and F<BUGS>
+
+=back
-=item *
+If you have found a bug, then you should send a bugreport.
-where the bug comes from: if GNU LilyPond bombs out, then please
-recompile using with debugging info turned on, and send a copy of the
-input which causes the error and a gdb stacktrace of the crash. It
-also helps if you can print the values of the objects. So if your
-trace is
+ - send a copy of the input which causes the error
+ - send a description of the platform you use
+ - send a description of the LilyPond version you use (with
+ compile/config options please)
+ - send a description of the bug itself.
+ - send it to bug-gnu-music@vuse.vanderbilt.edu
+It does help if you can find out where the bug comes from: if GNU
+LilyPond bombs out, then please recompile using with debugging info
+turned on, and send gdb stacktrace of the crash. It also helps if you
+can print the values of the objects. So if your trace is
+
+ received SIGSEGV
(gdb) backtrace 12
#0 Interval::operator+= (this=0x11fffec60..)
at ../flower/interval.hh:50
Than it would help if you send a dump of the Interval and the Item
(use: C<print *this> or use LilyPond C<print()> methods).
-=back
-
-Bug reports should be directed to:
-bug-gnu-music@vuse.vanderbilt.edu. In any case, they should contain a
-description of the problem, a small input file which reproduces it (if
-applicable), the lilypond version and a description of the platform.
-
=head1 FILES
updated very frequently, the latest version is always available at:
ftp://pcnov095.win.tue.nl/pub/lilypond.
-For programs which part of the GNU music project, the following mailing list
-have been setup:
+For programs which are part of the GNU music project, the following
+mailing list have been setup:
=over 4
attention, and I was slowly sucked in to the interesting problem of
easily producing beautifully printed music. I contributed some
code. We soon realised that MPP's design was too fundamentally broken
-to be repaired. It was decided to rewrite MPP. We debated a lot about
+to be repaired, so it was decided to rewrite MPP. We debated a lot about
the requirements to an inputformat (fall 1995). I sat down and started
with a parser-first, bottom-up rewrite called mpp95 (which totally
failed, obviously).
details on spacing; it was downloaded approximately 4 times. Then I
got the hang of it, and in the subsequent two months, I coded until it
had doubled in size (pl 23).
+
+The first large scale release (0.1) was planned after approximately 80
+patchlevels on August 1, 1997.
=head1 DESCRIPTION
Mi2mu translates a MIDI input file to Mudela (GNU LilyPond source
-format).
-Mi2mu is part of the GNU LilyPond music typesetting package.
+format). Mi2mu is part of the GNU LilyPond music typesetting package.
=head1 OPTIONS
--- /dev/null
+=head1 NAME
+
+mudela-book - integrate LaTeX and mudela
+
+=head1 SYNOPSIS
+
+ convert-mudela [options] [files]
+
+=head1 DESCRIPTION
+
+mudela-book runs LilyPond on fragments of mudela in your source file,
+and produces a LaTeXable document, with formatted music.
+
+ \begin{mudela}
+ CONTENTS
+ \end{mudela}
+
+runs LilyPond on CONTENTS, and puts the result back, surrounded by
+\preexample and \postexample commands. The \begin takes the
+following options:
+
+=over 4
+
+=item fragment
+
+mudela-book adds some redtape. You
+can substitute voice-contents for CONTENTS in this case.
+
+=item verbatim
+
+CONTENTS is copied into the TeX source enclosed in a verbatim block.
+
+=back
+
+=head1 OPTIONS
+
+=over 4
+
+=item B<--outname>
+
+The name of TeX file to output
+
+=item B<--outdir>
+
+The directory to output lilypond output and input to
+
+=back
+
+=head1 BUGS
+
+Doesn't handle incorrect input sanely.
+
+=head1 AUTHOR
+
+Han-Wen Nienhuys <hanwen@gnu.ai.mit.edu>
--- /dev/null
+% -*-LaTeX-*-
+\documentclass{article}
+\usepackage{a4wide}
+\title{Mudela and LilyPond crash course}
+\author{Han-Wen Nienhuys}
+
+\begin{document}
+\maketitle
+\def\interexample{\par Produces the following:\par}
+\def\preexample{\par\medskip}
+\def\postexample{\par\medskip}
+
+
+\section{Overview}
+Mudela is a language for specifying music. LilyPond is a
+program which converts such a specification into formatted sheet
+music, or MIDI output.
+
+Please note that some examples not only demonstrate features but also
+some lurking bugs. If can't understand what is happening, it might
+just be my (lack of) programming skills.
+
+
+\begin[fragment,verbatim]{mudela}
+ { c4 e4 g4 }
+\end{mudela}
+
+
+Basics: the \verb+%+ introduces a comment. All music is inside a
+\verb+\score+ block which represents one movement, ie one contiguous
+block of music. Voices are grouped by \verb+{+ and \verb+}+ and
+chords by \verb+<+ and \verb+>+.
+
+\begin[verbatim]{mudela}
+\score {
+ \melodic { % { means voice
+ c'4 g'4 % 4 means quaver, 1 beat in 4/4 meter
+ c''4 ''c4 % c' is 1 octave up, 'c 1 down.
+ <c'4 g'4> % <> means a chord
+ }
+}
+\end{mudela}
+
+The \verb+\octave+ command controls the default pitch (octave). If you
+do not specify duration, the last one entered is used. The
+\verb+\paper+ block contains parameters for spacing and dimensions.
+
+\begin[verbatim]{mudela}
+\score {
+ % twinkle twinkle little star
+ \melodic {
+ \octave c';
+ c4 c g g a a g2
+ f4 f e e d [d8. e16] c2
+
+ }
+ \paper { linewidth = 5.\cm; }
+}
+\end{mudela}
+
+A more complex example; The multi command controls at what level the
+different components of a chord are interpreted. The LilyPond chord
+is much more general than a traditional chord. Multiple voices on a
+staff are entered as a chord of voices. A score is a chord of staffs,
+etc.
+
+\begin[verbatim]{mudela}
+
+\score{
+ \melodic
+ { \octave c'; c4 c4
+ < \multi 1; { c2 c2 } { c'2 c'2 } >
+ < \multi 2; { \stem -1; c2 c2 } { \stem 1; c'2 c'2 } >
+ < \multi 3;
+ { \clef "bass"; c2 c2 }
+ { \meter 2/4;\bar "||";
+ \key fis cis gis; c'2 c'2 } >
+ c2 c1
+ c1 c1
+ < \multi 1; < \multi 3;
+ { \meter 2/4; \clef "violin"; c2 c2 }
+ { \meter 2/4; \clef "bass"; c2 c2 }
+ >
+ < \multi 3;
+ { \meter 2/4; \clef "violin"; c2 c2 }
+ { \meter 2/4; \clef "bass"; c2 c2 }
+ >
+ >
+ }
+}
+
+\end{mudela}
+
+
+LilyPond is designed to handle complicated stuff
+automatically. Expertise should be in the program, not in the user.
+
+The following example shows how multiple voice on the same staff are
+handled graciously (well, somewhat). If the noteheads of different
+voices collide, they are moved horizontally. The same goes for the rests.
+
+\begin[verbatim]{mudela}
+two_voice = \melodic
+ < \multi 2;
+ { \octave c'; \stem -1;
+ c4 d e f g2~ g4 a [c8 d e f] c2| }
+ { \stem 1;
+ g4 f e g ~ g2 g2 c4 g4 g2 }
+
+ >
+
+two_voice_steminvert = \melodic
+ < \multi 2;
+ { \octave c'; \stem 1;
+% the f and g on 4th beat are exceptionally ugh.
+ c4 d e f g2 g4 a | }
+ { \stem -1;
+ g4 f e g g2 g2 }
+
+ >
+
+three_voice = \melodic
+ < \multi 2;
+ { \stem 1;
+ g4 f e f g a g2 }
+ { \hshift 1; \stem 1;
+ e2 e2 e2 e2 }
+ { \stem -1;
+ c4 d e d c d es }
+ >
+
+
+restsII = \melodic {
+ \octave c';
+ < \multi2;
+ { \stem 1; g'8 f' e' d' c' b a g f e d c }
+ { \stem -1; r r r r r r r r r r r r }
+ >
+ r8 r4
+ < \multi2; r8 r8 >
+ < \multi2; r8 r8 r8 >
+ < \multi2; r8 r8 r8 r8 >
+ < \multi2; r r >
+ < \multi2; r r r >
+ \stem 1;
+ [c''8 r8 c''8 c''8]
+ [c8 r8 c8 c8]
+}
+
+\score{
+ \melodic { \$two_voice \$two_voice_steminvert
+ \$three_voice \restsII }
+}
+
+\end{mudela}
+
+\end{document}
--- /dev/null
+% -*-latex-*-
+\documentclass{article}
+\usepackage{a4wide}
+\title{GNU LilyPond input format 0.1}
+\author{Han-Wen Nienhuys}
+
+\begin{document}
+\maketitle
+\def\interexample{\par Produces the following:\par}
+\def\preexample{\par\medskip}
+\def\postexample{\par\medskip}
+\def\file#1{{\texttt{#1}}}
+
+\section{Introduction}
+
+This document describes the the GNU LilyPond input format, which is an
+effective language for defining music. We call this language
+(rather arrogantly) The Musical Definition Language (Mudela 0.1).
+
+[If anybody comes up with a better name, we'd gladly take
+this. Gourlay already uses Musical Description Language, GSharp Score
+Definition Language. We're not being original here]
+
+The first aim of Mudela is to define a piece of music,
+being complete from both from a musical typesetting,
+as from a musical performing point of view.
+
+
+The Musical Definition Language (Mudela) version 2, has a logical
+structure, making use of typing and naming (using identifiers), that
+allows for flexible input, and definition reuse. See MANIFESTO for
+reasons and design considerations.
+
+The below included for explanatory purposes only (i.e., for a complete
+and up-to-date definition, see \file{lily/parser.y} and
+\file{lily/lexer.l}):
+
+As a related note, you should take a look at the examples and the init
+files, as this document does not cover every aspect of mudela yet, and
+may be out of date.
+
+
+\subsection{Files}
+
+The de-facto extension of Mudela is \file{.ly}. Files may be included by
+entering \verb+include+ at the start of a line:
+
+\begin{verbatim}
+\include "a_file.ly"
+\end{verbatim}
+
+
+\subsection{Comments}
+
+Line comments are introduced by a \verb+%+. Block comments are delimited
+by \verb+%{+ and \verb+%}+. They do not nest.
+
+\subsection{Versions}
+
+Occasionally, small changes in syntax across different versions of
+Mudela might give syntax errors. To warn you about possible
+incompatibilities, you can specify the Mudela version for which the
+inputfile was written,
+\begin{verbatim}
+\version "0.0.50";
+\end{verbatim}
+
+A perl-script which tries to convert to newer versions
+(\file{convert-mudela}) is included in the LilyPond distribution.
+
+\subsection{Words}
+
+Keywords are preceded by a backslash: \verb+\+. They contain
+alphabetic characters only.
+
+Identifiers in their normal form consist start with a backslash, a
+alpha character, followed by alpha-numerics. Identifiers can contain
+any characters (except whitespace, \verb+$+ and \verb+%+), if you use this
+construct:
+
+\begin{verbatim}
+\$i'm_a_weird!!!identifier
+\end{verbatim}
+
+(which is the identifier with the name
+\verb+i'm_a_weird!!!identifier+). \verb+$+ Takes any sequence of
+characters which are not whitespace, \verb+$+ and \verb+%+.
+\verb+$i'm_a_weird!!!string+
+
+\subsection{Nesting characters}
+
+Mudela uses the brace (\verb+{+ and \verb+}+) for most hierarchical
+structures. For chords the \verb+<+ and the \verb+>+ are used as
+nesting braces.
+
+\subsection{Constants}
+
+Please note that -.5 is not a Real.
+
+\begin{verbatim}
+"I am a string"
+-1.2e3 % a real
+12 % an int
+\end{verbatim}
+
+
+\subsection{Identifiers}
+
+When assigning identifiers you use
+
+\begin{verbatim}
+string = ...
+\oldidentifier = ..
+\end{verbatim}
+
+When using identifiers they have to be escaped:
+
+\begin{verbatim}
+oboe = \melodic { ... }
+\score{ \melodic { \oboe }}
+\end{verbatim}
+\subsection{Hierarchical structures}
+
+The general structure consists of declarations:
+\begin{verbatim}
+IDENTIFIER = \TYPE{
+ <type specific data>
+}
+\end{verbatim}
+and instantiations:
+
+\begin{verbatim}
+\TYPE{ <type specific data> }
+\end{verbatim}
+
+(Currently, \verb+\score+ is the only type that can be instantiated
+at top level. Currently declarations can only be done at top level)
+
+Most instantiations that use an IDENTIFIER are specified as follows:
+
+\begin{verbatim}
+\TYPE{ IDENTIFIER [...] }
+\end{verbatim}
+
+Some exceptions on this rule have been made to prevent inputting
+Mudela becoming tedious
+
+
+\subsection{Modes:}
+
+To simplify different aspects of music definition (entering the notes
+and manipulating them) Mudela has a number of different input "modes":
+
+\begin{description}
+
+
+\item[Normal mode]
+
+At the start of parsing, Mudela assumes normal mode.
+In Normal mode, a word is looked up in the following order:
+\begin{verbatim}
+word string
+\word keyword, identifier
+\end{verbatim}
+In normalmode, a word is assumed to start with an alphabetic
+character, followed by alpha-numeric characters.
+
+\item[Note mode]
+ Note mode (and thus Simple mudela) is introduced by
+ the keyword \verb+\melodic+. In Note mode, a word is looked up in
+ the following order:
+
+\begin{verbatim}
+word notename, string
+\word keyword, identifier
+\end{verbatim}
+In Note mode a word is considered to have alphabetic characters only.
+
+\item[Lyric mode]
+Lyrics mode (and thus Simple mudela) is introduced by the keyword \verb+\lyrics+.
+
+In Lyrics mode, a word is looked up in the following order:
+
+\begin{verbatim}
+word string
+\word keyword, identifier
+\end{verbatim}
+
+In Lyric mode every sequence of non-digit and non-white characters
+starting with an alphabetic character or the \_ is considered a word.
+
+\begin{verbatim}
+a&@&@&TSI|{[ % a word
+1THtrhortho % not a "word"
+Leise Fl\"u\ss{}teren meine Sapfe % 4 words
+_ _ _ _ % 4 words: 4 spaces
+\end{verbatim}
+\end{description}
+
+These modes are of a lexical nature. Normal and Note mode largely
+resemble each other, save the possibility of entering Reals,
+meaning of \verb+_+ and the resolution of words
+
+\subsection{Notes}
+
+You enter a note by giving the name and the reciprocal of the duration:
+
+\begin[fragment,verbatim]{mudela}
+a'4 % dutch names
+\end{mudela}
+
+is a A-1 pitched quaver. The ' signifies an octave change. A-1 is 440
+Hz concert-pitch. \verb+c'+ is also known as the central c. More examples:
+
+\begin[fragment,verbatim]{mudela}
+'a % 110
+ a % 220
+ A % 110, uppercase octavates down
+ a' % 440
+a'' % 880
+'as4.*2/3
+\end{mudela}
+
+The last one is an A flat, (just below 110 Hz concert-pitch). The \verb+*2/3+
+signifies that this note is part of a triplet (3 in stead of 2). The
+duration is one and a half quaver (\verb+4.+) times 2/3.
+
+Notenames are just a special kind of identifiers, and can be declared
+for any language appropriate (see \file{dutch.ini}). The default language
+for notenames is defined to be dutch. In dutch, the notenames are
+a,b,c,d,e,f and g. Sharps are formed by adding the extension "is",
+flats by adding ``es''
+
+\begin{verbatim}
+% double sharp
+cisis disis eisis fisis gisis aisis bisis
+% sharps
+cis dis eis fis gis ais bis
+% naturals
+c d e f g a b
+% flats
+ces des es fes ges as bes
+% double flats
+ceses deses eses feses geses ases beses
+\end{verbatim}
+
+Rests are named r or s
+\begin{verbatim}
+r % print a rest
+s % a "space" rest, nothing is printed.
+\end{verbatim}
+
+These notenames along with duration are enough material to construct
+simple melodies:
+
+\begin[verbatim,fragment]{mudela}
+\octave c';
+c4 c4 g4 g4 a4 a4 g2
+f4 f4 e4 e4 d4 d4 c2
+\end{mudela}
+
+Music is able to express more. generally speaking, the other
+'features' are either connected between notes (slurs, beams: spanning
+requests) or attached to notes (eg. accents). The former are
+implemented as START and STOP stop features and then attached to the note.
+
+\begin{verbatim}
+[] START/STOP a beam
+() START/STOP a slur
+\end{verbatim}
+
+example:
+\begin[verbatim,fragment]{mudela}
+ \octave c';
+ [c8 () d8 () e8
+ e8(] [)g8 <c'8] e'8> % NO nesting!
+ [2/3 c8 c8 c8]1/1 % a triplet
+\end{mudela}
+
+Please note that these two characters do \emph{not} necessarrily nest,
+they should attached to the note \verb+[ <c4 c4>]+ will generate a parse
+error for this reason.
+
+\subsection{Slurs and Ties}
+
+Ties connect the noteheads of adjecent notes. They are entered as follows:
+
+\begin[fragment]{mudela}
+a4 ~ a4
+\end{mudela}
+
+Slurs connect whole chords, and try to avoid crossing stems. They are
+entered as follows:
+\begin{verbatim}
+
+\begin[fragment]{mudela}
+a4( )a4
+\end{mudela}
+
+\subsection{Scripts}
+
+Symbols which can be put at either side (above or below) of a staff
+are entered as follows:
+\begin[fragment]{mudela}
+a-^ % marcato, direction: default
+ a^- % portato, direction: above note
+ a_. % staccato, direction: below note
+ a^\fermata % predefined identifier
+ c_"marcato" % add a text
+ c^"marcato"
+c-"marcato"
+\end{mudela}
+
+If you want to define your own scripts refer to \file{script.ini} for
+details.
+
+
+Dynamics can be put after the notename:
+\begin{verbatim}
+a4 \dynamic { 0 } % 0 = fff, 7 = ppp
+\end{verbatim}
+
+Mudela defines the following dynamic identifiers:
+
+\begin{verbatim}
+ppp pp p mp mf df ff fff % df iso f, f is a notename.
+\end{verbatim}
+and the following abbreviations:
+\begin{verbatim}
+\< %start crescendo
+\> % start decrescendo
+\! % end crescendo/decrescendo
+\end{verbatim}
+
+\subsection{Defaults}
+
+If omit the duration of a note, a default value is substituted. For
+this default value mudela uses the last duration explicitly entered.
+
+Thus the following inputs are equivalent
+\begin{verbatim}
+c4 c4 c16 c16 c16 s16 c4 c16
+c4 c c16 c c c c4 c16
+\end{verbatim}
+
+If you are typing music which does not lie in the "small" and "large"
+octave, you can prevent having to type \verb+'+ all the time by using the
+\verb+\octave+ command: These two lines have the same pitch.
+\begin{verbatim}
+c'' d'' e'' c d e c d e
+
+\octave c''; c d e ''c ''d ''e \octave c; c d e
+\end{verbatim}
+
+By default the setting of \verb+\octave+ is 0.
+
+\subsection{Lyrics}
+
+Lyrics in Mudela resemble Simple mudela a lot, with notes substituted
+by text.
+
+All syllables are entered separately, separated by whitespace
+\begin{verbatim}
+Twin-4 kle4 twin-4 kle4 ...
+\end{verbatim}
+
+Two syllables or words that compose a single
+duration entry are bound together using an underscore
+\begin{verbatim}
+He_could4 not4
+\end{verbatim}
+
+\subsection{ Music direction}
+
+Mudela reads left to right, but you can still stack voices and
+Voice\_elements which are produced in two directions: horizontal
+(voice like) and vertical (chord like)
+
+A note is a prime example of a Music-element is the note:
+\begin{verbatim}
+c4
+\end{verbatim}
+
+If you enclose a sequence of Music-elements in braces ( { } ), then you form
+another kind of Music-element (Voice) with those pieces
+\begin{verbatim}
+ { c c g g a a g2 } % twinkle twinkle
+ { { c c g g} { a a g2 } }
+
+ horOne = \melodic { c c g g }
+ horTwo = \melodic { a a g2 }
+ twinkle = \melodic { \horOne \horTwo }
+\end{verbatim}
+
+You can stack Music-elements by enclosing a sequence Music-elements of
+notes with < and >. Example:
+\begin{verbatim}
+<a cis e'> % a-major chord
+\end{verbatim}
+You can also put vertical music inside horizontal music:
+\begin{verbatim}
+{ c <c e> <c e g> <c e g c'> } % 4 increasing chords
+\end{verbatim}
+And vice versa
+\begin{verbatim}
+< \multi 2;
+ {c c g g a a g2}
+ {r2 r2 c c g g a a g2} > % a canon
+\end{verbatim}
+
+The duration of a chord equals the union of the durations of each of
+its elements. The \verb+\multi 2+ is a construct which is explained
+below.
+
+You can also create a Music-element by transposing a Music-element:
+\begin{verbatim}
+\transpose
+ d % from c to the d that's one octave down
+ { e4 f4 } % the horizontal music
+
+\end{verbatim}
+
+\subsection{Voicegroups}
+
+If more than one "voice" is in a staff, then you have the option of
+putting the different voices into so called voicegroups: members of
+the same voicegroup share certain characteristics, among others:
+
+ - dynamics
+ - text
+ - beams and stems
+ - scripts
+
+For the actual list, see the init file \file{register.ini}
+
+Putting different musical lines in to the same voicegroup effectively
+makes LilyPond try to form chords of all those lines. Putting
+different musical lines in to different voicegroups effectively makes
+LilyPond try to set those lines as independently as possible.
+
+You can set the voicegroup of a voice with the command \verb+\group+, e.g.,
+\begin{verbatim}
+ oboeI = \melodic {
+ \group "oboes";
+ [e8 f8
+ \group "+solo";
+ [g16 a16 g16 fis16]
+ \group "-";
+ g8 f8
+ }
+ oboeII = \melodic { \group "oboes";
+ c8 d8]
+ e4
+ e8 d8
+ }
+ /// ...
+
+ \staff {
+ melodicregs \melodic{ oboeI }
+ \melodic { oboeII}
+}
+\end{verbatim}
+In this example, the two oboe voices share one staff and are initially
+in the voicegroup called "oboes". They will share beams, dynamics etc.
+After two quavers, oboeI "pushes" its group: a new voicegroup is
+created, called "oboes+solo". The \verb+\group "-"+ command makes the
+voice enter "oboes" again.
+
+Please do note that [] are voicegroup wide; the previous input is
+valid: the beam, started in oboeI, voicegroup "oboes" is also ended in
+voicegroup "oboes", albeit not in oboeI but oboeII
+
+This concept may seem contorted, but it allows you to set the separate
+oboe parts without changing the \verb+oboeI+ and \verb+oboeII+ (assuming that
+you edit the [] in the example.)
+
+The construct
+\begin{verbatim}
+< { .... } {......} >
+\end{verbatim}
+makes a chord (all horizontal parts are in the same voicegroup). The construct
+\begin{verbatim}
+< \multi 2; { ....} { .... } >
+\end{verbatim}
+creates horizontal parts which behave independently. You will have to
+set voicegroup features by hand (\verb+\stem+ and \verb+\hshift+. See examples)
+
+The construct
+\begin{verbatim}
+< \multi 3; { ....} { .... } >
+\end{verbatim}
+creates a chord with each part in a different staff
+
+
+\subsection{Durations}
+
+A duration always starts with the duration type (1,2,4 etc), and then
+any optional multipliers/dots
+
+\subsection{Meters/groupings}
+
+A meter has this form:
+\begin{verbatim}
+\meter 3/4 ;
+\end{verbatim}
+
+Rhythmic grouping is a concept closely associated with this. For
+example, in a 5/8 meter, the counts are grouped 2+3. In mudela this is
+entered as
+\begin{verbatim}
+\grouping 8*2 8*3 ;
+\end{verbatim}
+You can start the piece with a partial measure, the command takes the
+same syntax as grouping:
+\begin{verbatim}
+\partial 16*3 4;
+\end{verbatim}
+
+Make the piece start with a partial measure [transl?] lasting 1 3/4
+quaver.
+
+These commands are also "voice elements", and constitute simple mudela
+(consisting of stuff with duration 0).
+
+\section{STRUCTURE}
+
+In concrete, a piece of Mudela has the following structure:
+\begin{verbatim}
+% declare pieces of music:
+ melody = \music{ <simple mudela> }
+ accompany = \music{ <simple mudela> }
+
+ % instantiate (=create tex, midi output) the score:
+ \score{
+ \melodic <
+ \multi 3;
+ \melody
+ \accompany
+ >
+ \midi{ <midi definitions> }
+ \paper{ <paper and layout definitions> }
+}
+\end{verbatim}
+
+\subsection{Examples}
+
+Examples are included with the GNU LilyPond distribution. For the sake of
+maintenance no long examples are included in this document.
+
+
+\section{HISTORY}
+
+This language has a number of roots. First and foremost, GNU LilyPond's
+predecessor mpp was the inspiration of simple Mudela. Secondly, the
+hierarchical structure looks a lot like Rayce's (Rayce is a raytracer
+that I've written as a hobby project. ), which in turn owes a lot to
+POVRay.
+
+Now, we know, musictypesetting and raytracing do not necessarily
+require the same input format, and we know that a lot more ways exist
+to convert music to ASCII, but we did give this language some
+thoughts. As always suggestions are appreciated.
+
+\end{document}
+
+++ /dev/null
-=head1 NAME
-
-Mudela - GNU LilyPond input format 0.1
-
-=head1 DESCRIPTION
-
-This document describes the the GNU LilyPond input format, which is an
-effective language for defining music. We call this language
-(rather arrogantly) The Musical Definition Language (S<Mudela 0.1>).
-
-[If anybody comes up with a better name, we'd gladly take this Gourlay
-already uses Musical Description Language, GSharp Score Definition
-Language. We're not being original here]
-
-The first aim of Mudela is to define a piece of music,
-being complete from both from a musical typesetting,
-as from a musical performing point of view.
-
-
-=head1 Overview
-
-The Musical Definition Language (Mudela) S<version 2>, has a logical
-structure, making use of typing and naming (using identifiers), that
-allows for flexible input, and definition reuse. See MANIFESTO for
-reasons and design considerations.
-
-The below included for explanatory purposes only (i.e., for a complete
-and up-to-date definition, see F<lily/parser.y> and F<lily/lexer.l>):
-
-As a related note, you should take a look at the examples and the init
-files, as this document does not cover every aspect of mudela yet, and
-may be out of date.
-
-=head2 Files
-
-The de-facto extension of Mudela is F<.ly>. Files may be included by
-entering C<include> at the start of a line:
-
- \include "a_file.ly"
-
-=head2 Comments
-
-Line comments are introduced by a C<%>. Block comments are delimited
-by C<%{> and C<%}>. They do not nest.
-
-=head2 Versions
-
-Occasionally, small changes in syntax across different versions of
-Mudela might give syntax errors. To warn you about possible
-incompatibilities, you can specify the Mudela version for which the
-inputfile was written,
-
- \version "0.0.50";
-
-A perl-script which tries to convert to newer versions
-(F<convert-mudela>) is included in the LilyPond distribution.
-
-=head2 Words
-
-Keywords are preceded by a backslash: '\'. They contain alphabetic
-characters only.
-
-Identifiers in their normal form consist start with a alpha character,
-followed by alpha-numerics. Identifiers can contain any characters
-(except whitespace, C<$> and C<%>), if you use this construct:
-
- $i'm_a_weird###identifier
-
-(which is the identifier with the name
-C<i'm_a_weird###identifier> ). C<$> Takes any sequence of
-characters which are not whitespace, C<$> and C<%>.
-
- \$i'm_a_weird###escaped_word
-
-=head2 Nesting characters
-
-Mudela uses the brace (C<{> and C<}>) for hierarchical structures. To
-aid the eye in reading, for chords the < and the > are used as
-nesting braces.
-
-=head2 Constants
-
-Please note that -.5 is no Real.
-
- "I am a string"
- -1.2e3 % a real
- 12 % an int
-
-
-
-=head2 Identifiers
-
-=head2 Hierarchical structures
-
-The general structure consists of declarations:
-
- IDENTIFIER = \TYPE{
- <type specific data>
- }
-
-and instantiations:
-
- \TYPE{ <type specific data> }
-
-(Currently, C<\score> is the only type that can be instantiated
-at top level. Currently declarations can only be done at top level)
-
-Most instantiations that use an IDENTIFIER are specified as follows:
-
- \TYPE{ IDENTIFIER [...] }
-
-Some exceptions on this rule have been made to prevent inputting
-Mudela becoming tedious
-
-
-=head2 Simple mudela
-
-The actual musical part of Mudela that defines a melody, is known as
-I<simple mudela>.
-
-Simple mudela is the most common type of music. It consists of a list
-of notes or lyrics, chords, and commands.
-
-=head2 Modes:
-
-To simplify different aspects of music definition (entering the notes
-and manipulating them) Mudela has a number of different input "modes":
-
-=over 4
-
-=item Normal mode
-
-At the start of parsing, Mudela assumes normal mode.
-In Normal mode, a word is looked up in the following order:
-
- word identifier, string
- \word keyword, identifier, string
-
-In normalmode, a word is assumed to start with an alphabetic
-character, followed by alpha-numeric characters.
-
-=item Note mode
-
-Note mode (and thus Simple mudela) is introduced by the keyword C<\melodic>.
-In Note mode, a word is looked up in the following order:
-
- word notename, string
- \word keyword, identifier, string
-
-In Note mode a word is considered to have alphabetic characters only.
-
-=item Lyric mode
-
-Lyrics mode (and thus Simple mudela) is introduced by the keyword C<\lyrics>.
-
-In Lyrics mode, a word is looked up in the following order:
-
- word string
- \word keyword, identifier, string
-
-In Lyric mode every sequence of non-digit and non-white characters
-starting with an alphabetic character or the '_'is considered a word.
-
- a&@&@&TSI|{[ % a word
- 1THtrhortho % not a "word"
- Leise Fl\"u\ss{}teren meine Sapfe % 4 words
- _ _ _ _ % 4 words: 4 spaces
-
-=back
-
-These modes are of a lexical nature. Normal and Note mode largely
-resemble each other, save the possibility of entering Reals,
-meaning of C<_> and the resolution of words
-
-=head2 Notes
-
-Simple mudela basically is a sequence of the notes you want to
-enter.
-
- a'4 % dutch names
-
-is a A-1 pitched quaver. The ' signifies an octave change. A-1 is 440
-Hz concert-pitch. C<c'> is also known as the central c. More examples:
-
- 'a % 110
- a % 220
- a' % 440
- a'' % 880
-
-another example:
-
- 'as4.*2/3
-
-This is an A flat, (just below 110 Hz concert-pitch). The C<*2/3>
-signifies that this note is part of a triplet (3 in stead of 2). The
-duration is one and a half quaver (C<4.>) times 2/3.
-
-
-Notenames are just a special kind of identifiers, and can be declared
-for any language appropriate (see F<dutch.ini>). The default language
-for notenames is defined to be dutch. In dutch, the notenames are
-a,b,c,d,e,f and g. Sharps are formed by adding the extension "is",
-flats by adding "es"
-
- % double sharp
- cisis disis eisis fisis gisis aisis bisis
- % sharps
- cis dis eis fis gis ais bis
- % naturals
- c d e f g a b
- % flats
- ces des es fes ges as bes
- % double flats
- ceses deses eses feses geses ases beses
-
-The standard notenames also have uppercase versions, which octavate
-down:
-
- a % 220 concert-pitch
- A % 110
- 'A % 55
- A' % 220
- Cisis
-
-Rests are named r or s
-
- r % print a rest
- s % a "space" rest, nothing is printed.
-
-These notenames along with duration are enough material to construct
-simple melodies:
-
- c4 c4 g4 g4 a4 a4 g2
- f4 f4 e4 e4 d4 d4 c2
-
-Music is able to express more. generally speaking, the other
-'features' are either connected between notes (slurs, beams: spanning
-requests) or attached to notes (eg. accents). The former are
-implemented as START and STOP stop features and then attached to the note.
-
- [] START/STOP a beam
- () START/STOP a slur
-
-
-example:
-
- [c8 () d8 () e8 ]
-
-Please note that these two characters do I<not> necessarrily nest,
-they should attached to the note C<[ {c4 c4} ]> will generate a parse
-error for this reason.
-
- [c8 e8(] [)g8 <c'8] e'8>
- % NO nesting!
- [2/3 c8 c8 c8]1/1 % a triplet
-
-
-=head2 Slurs and Ties
-
-Ties connect the noteheads of adjecent notes. They are entered as follows:
-
- a4 ~ a4
-
-Slurs connect whole chords, and try to avoid crossing stems. They are
-entered as follows:
-
- a4( )a4
-
-=head2 Scripts
-
-Symbols which can be put at either side (above or below) of a staff
-are entered as follows:
-
- a-^ % marcato, direction: default
- a^- % portato, direction: above note
- a_. % staccato, direction: below note
- a^\script { "symbolindex" . . . } % see script.ini for details.
- a^\fermata % predefined identifier
-
-Dynamics can be put after the notename:
-
- a4 \dynamic { 0 } % 0 = fff, 7 = ppp
-
-Mudela defines the following dynamic identifiers:
-
- ppp pp p mp mf df ff fff % df iso f, f is a notename.
-
-and the following abbreviations:
-
- \< %start crescendo
- \> % start decrescendo
- \! % end crescendo/decrescendo
-
-=head2 Text
-
-To accompany a note with a text (eg, "marcato"), you should say:
-
- c_"marcato"
- c^"marcato"
- c-"marcato"
-
-the c- construct chooses the default up/down direction.
-
-
-
-
-=head2 Defaults
-
-If omit the duration of a, a default value is substituted. For this
-default value, there are two modes:
-
-=over 4
-
-=item 1
-
-Use the last duration explicitly entered
-
-=item 2
-
-Use the explicitly set "default duration"
-
-=back
-
-Thus the following inputs are equivalent
-
- c4 c4 c16 c16 c16 s16 c4 c16
-
- \duration { "last" }
- c4 c c16 c c c c4 c16
-
- \duration { 4 }
- c c c16 c16 c16 c16 c c16
-
- \duration { 16 }
- c4 c4 c c c c c4
-
-If you are typing music which does not lie in the "small" and "large"
-octave, you can prevent having to type C<'> all the time by using the
-C<\octave> command: These two lines have the same pitch.
-
- c'' d'' e''
- \octave{c''} c d e
-
-By default the setting of C<\octave> is 0.
-
-=head2 Lyrics
-
-Lyrics in Mudela resemble Simple mudela a lot, with notes substituted
-by text.
-
-All syllables are entered separately, separated by whitespace
-
- Twin-4 kle4 twin-4 kle4 ...
-
-Two syllables or words that compose a single
-duration entry are bound together using an underscore
-
- He_could4 not4
-
-=head2 Music direction
-
-Mudela reads left to right, but you can still stack voices and
-Voice_elements which are produced in two directions: horizontal
-(voice like) and vertical (chord like)
-
-A sequence of notes (horizontal) is called simple horizontal, eg
-
- c4 c4 g4 g4
-
-
-You can also glue two pieces of simple horizontal music together with the
-concatenation operator:
-
- horOne = \melodic { c c g g }
- horTwo = \melodic { a a g2 }
- twinkle = \melodic { \horOne ++ \horTwo }
-
-If you enclose simple horizontal music in braces ( { } ), then you get
-horizontal music:
-
- { c c g g a a g2 } % twinkle twinkle
-
-You can start vertical music (a "chord") by enclosing a sequence of
-notes with < and >. Example:
-
- <a cis e'> % a-major chord
-
-You can also put vertical music inside horizontal music:
-
- { c <c e> <c e g> <c e g c'> } % 4 increasing chords
-
-And vice versa
-
- < \multivoice
- {c c g g a a g2}
- {r2 r2 c c g g a a g2} > % a canon
-
-The duration of a chord equals the union of the durations of each of
-its elements. The C<\multivoice> is a construct which is explained
-below.
-
-
-=head2 Transposition
-
-You can transpose horizontal music in the following way:
-
-
- \melodic {
- \meter 2/4;
- ++
- \transpose {
- d % from c to the d that's one octave down
- { e4 f4 } % the horizontal music
- } ++ g4
- }
-
-The result is, as you can see, again simple horizontal music.
-
-
-=head2 Voicegroups
-
-If more than one "voice" is in a staff, then you have the option of
-putting the different voices into so called voicegroups: members of
-the same voicegroup share certain characteristics, among others:
-
- - dynamics
- - text
- - beams and stems
- - scripts
-
-For the actual list, see the init file F<register.ini>
-
-Putting different musical lines in to the same voicegroup effectively
-makes LilyPond try to form chords of all those lines. Putting
-different musical lines in to different voicegroups effectively makes
-LilyPond try to set those lines as independently as possible.
-
-You can set the voicegroup of a voice with the command C<\group>, e.g.,
-
- oboeI = \melodic {
- \group "oboes";
- [e8 f8
- \group "+solo";
- [g16 a16 g16 fis16]
- \group "-";
- g8 f8
- }
- oboeII = \melodic { \group "oboes";
- c8 d8]
- e4
- e8 d8
- }
- /// ...
-
- \staff {
- melodicregs \melodic{ oboeI }
- \melodic { oboeII}
- }
-
-In this example, the two oboe voices share one staff and are initially
-in the voicegroup called "oboes". They will share beams, dynamics etc.
-After two quavers, oboeI "pushes" its group: a new voicegroup is
-created, called "oboes+solo". The C<\group "-"> command makes the
-voice enter "oboes" again.
-
-Please do note that [] are voicegroup wide; the previous input is
-valid: the beam, started in oboeI, voicegroup "oboes" is also ended in
-voicegroup "oboes", albeit not in oboeI but oboeII
-
-This concept may seem contorted, but it allows you to set the separate
-oboe parts without changing the C<oboeI> and C<oboeII> (assuming that
-you edit the [] in the example.)
-
-The construct
-
- < { .... } {......} >
-
-makes a chord (all horizontal parts are in the same voicegroup). The construct
-
- < \multivoice { ....} { .... } >
-
-creates horizontal parts which behave independently. You will have to
-set voicegroup features by hand (\stem and \hshift. See examples)
-
-
-
-
-=head2 Rhythms
-
-Rhythms in Mudela are entered identical to Simple mudela.
-The melodic part of the information is ignored.
-
-=head2 Durations
-
-A duration always starts with the duration type (1,2,4 etc), and then
-any optional multipliers/dots
-
-=head2 Meters/groupings
-
-A meter has this form:
-
- \meter 3/4 ;
-
-Rhythmic grouping is a concept closely associated with this. For
-example, in a 5/8 meter, the counts are grouped 2+3. In mudela this is
-entered as
-
- \grouping 8*2 8*3 ;
-
-You can start the piece with a partial measure, the command takes the
-same syntax as grouping:
-
- \partial 16*3 4;
-
-Make the piece start with a partial measure [transl?] lasting 1 3/4
-quaver.
-
-These commands are also "voice elements", and constitute simple mudela
-(consisting of stuff with duration 0).
-
-=head1 STRUCTURE
-
-In concrete, a piece of Mudela has the following structure:
-
- % declare pieces of music:
- melody = \music{ <simple mudela> }
- accompany = \music{ <simple mudela> }
-
- % instantiate (=create tex, midi output) the score:
- \score{
- \staff{ melodicregs melody }
- \staff{ melodicregs accompany }
- \midi{ <midi definitions> }
- \paper{ <paper and layout definitions> }
- }
-
-=head2 Examples
-
-Examples are included with the GNU LilyPond distribution. For the sake of
-maintenance no long examples are included in this document.
-
-=head2 Staff
-
-The staff is a simple container (containing Voices). The so-called
-"registers" determine the characteristics of the Staff. At this time,
-LilyPond supports the following personalities:
-
-=over 4
-
-=item melodicregs
-
-This makes the staff into a single five line melodic staff.
-
-=item lyricregs
-
-This makes the staff into a staff which will only set Lyric_requests.
-
-=back
-
-
-=head1 HISTORY
-
-
-This language has a number of roots. First and foremost, GNU LilyPond's
-predecessor mpp was the inspiration of simple Mudela. Secondly, the
-hierarchical structure looks a lot like Rayce's (Rayce is a raytracer
-that I've written as a hobby project. ), which in turn owes a lot to
-POVRay.
-
-Now, we know, musictypesetting and raytracing do not necessarily
-require the same input format, and we know that a lot more ways exist
-to convert music to ASCII, but we did give this language some
-thoughts. As always suggestions are appreciated.
-
=item G Sharp, http://dept-info.labri.u-bordeaux.fr/~strandh/Gsharp
-An alpha version notation editor for X. Source available on request.
+An alpha version notation editor for X in Scheme. Source available on
+request.
=item Rosegarden, http://www.math.bath.ac.uk/~masjpf/rose.html
http://www-ccrma.stanford.edu/CCRMA/Software/cmn/cmn.html
A versatile lisp package. Part of the Common Music system. Input is in
-Lisp. It needs Adobe fonts
+Lisp. It needs some Adobe fonts
=item Vivace, http://www.calband.berkeley.edu/~gmeeker/vivace
A TeX macro package for typesetting single-staff music by Angelika
Schofer & Andrea Steinbach. With some fonts
-
=head2 Free (zero cents)
=item Calliope, http://www.cl.cam.ac.uk/users/wfc/
=item LIME, http://datura.cerl.uiuc.edu/
+Notation editor for W95 and Mac
+
=item Sibelius, http://www.acorn.co.uk/developers/sibelius
+Notation/engraving on Acorn machines.
+
=item Finale
=item Score
=item MusiCopy, ?
-Ohio State university.
+A project at Ohio State university, which was discontinued in 1987.
=item Berlioz, http://www.bsi.fr/~montel/
This page documents installation and compilation of GNU
LilyPond
-I\bI\bI\bIM\bM\bM\bMP\bP\bP\bPO\bO\bO\bOR\bR\bR\bRT\bT\bT\bTA\bA\bA\bAN\bN\bN\bNT\bT\bT\bT
- if you have downloaded a
-
- *.pre*
-
- version, then this is version is _\bn_\bo_\bt meant for producing
- nice output, but to keep your patchsets up to date. It
- might not even compile.
-
P\bP\bP\bPR\bR\bR\bRE\bE\bE\bER\bR\bR\bRE\bE\bE\bEQ\bQ\bQ\bQU\bU\bU\bUI\bI\bI\bIS\bS\bS\bSI\bI\bI\bIT\bT\bT\bTE\bE\bE\bES\bS\bS\bS
For compilation you need.
+\bo Bison. (Version 1.25 or better)
-R\bR\bR\bRE\bE\bE\bEC\bC\bC\bCO\bO\bO\bOM\bM\bM\bMM\bM\bM\bME\bE\bE\bEN\bN\bN\bND\bD\bD\bDE\bE\bE\bED\bD\bD\bD
- +\bo Perl. Most scripts are written in Perl. The
- documentation was created with the perl's Plain Old
- Documentation.
+R\bR\bR\bRU\bU\bU\bUN\bN\bN\bNN\bN\bN\bNI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
+ GNU LilyPond does use a lot of resources. For operation
+ you need the following:
- +\bo (GNU) find
+ +\bo TeX
-C\bC\bC\bCO\bO\bO\bON\bN\bN\bNF\bF\bF\bFI\bI\bI\bIG\bG\bG\bGU\bU\bU\bUR\bR\bR\bRI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG a\ba\ba\ban\bn\bn\bnd\bd\bd\bd C\bC\bC\bCO\bO\bO\bOM\bM\bM\bMP\bP\bP\bPI\bI\bI\bIL\bL\bL\bLI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
- to install GNU LilyPond, simply type:
+ +\bo The MusixTeX fonts (I included those found in
+ MusixTeX T.73). Beware, the clef symbol seems to have
+ changed its position in some versions, (notably
+ Egler's, a.k.a. OpusTeX). The MusixTeX fonts are
+ included in MusixTeX T.73, which can be had from any
+ CTAN site, eg at
- configure
- make install
+ ftp://ftp.shsu.edu/tex-archive/macros/musixtex/taupin
+ ftp://ftp.tex.ac.uk/tex-archive/macros/musixtex/taupin
+ ftp://ftp.dante.de/tex-archive/macros/musixtex/taupin
- This will install the following files:
+ You only need the contents of the _\bm_\bf_\b/ subdirectory of
+ the package.
+
+R\bR\bR\bRE\bE\bE\bEC\bC\bC\bCO\bO\bO\bOM\bM\bM\bMM\bM\bM\bME\bE\bE\bEN\bN\bN\bND\bD\bD\bDE\bE\bE\bED\bD\bD\bD
+ Although not strictly necessary, these are recommended to
+ have.
+ +\bo Perl. Most scripts are written in Perl. The
+ documentation was created with the perl's Plain
+ Old Documentation.
+28/Jul/97 LilyPond 0.0.76 1
-7/Jul/97 LilyPond 0.0.74 1
+INSTALL(1) LilyPond documentation INSTALL(1)
+ +\bo (GNU) find
-INSTALL(1) LilyPond documentation INSTALL(1)
+ +\bo A fast computer (a full page of music typically
+ takes 1 minute on my 486/133, using the
+ -\b-\b-\b--\b-\b-\b-e\be\be\ben\bn\bn\bna\ba\ba\bab\bb\bb\bbl\bl\bl\ble\be\be\be-\b-\b-\b-c\bc\bc\bch\bh\bh\bhe\be\be\bec\bc\bc\bck\bk\bk\bki\bi\bi\bin\bn\bn\bng\bg\bg\bg compile. It's lot slower than
+ most MusiXTeX preprocessors)
+C\bC\bC\bCO\bO\bO\bON\bN\bN\bNF\bF\bF\bFI\bI\bI\bIG\bG\bG\bGU\bU\bU\bUR\bR\bR\bRI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG a\ba\ba\ban\bn\bn\bnd\bd\bd\bd C\bC\bC\bCO\bO\bO\bOM\bM\bM\bMP\bP\bP\bPI\bI\bI\bIL\bL\bL\bLI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
+ to install GNU LilyPond, simply type:
+
+ configure
+ make install
+
+ This will install the following files:
/usr/local/man/man1/mi2mu.1
/usr/local/man/man5/mudela.5
/usr/local/bin/mi2mu
/usr/local/share/lilypond/*
/usr/lib/texmf/texmf/tex/lilypond/*
- /usr/lib/texmf/texmf/fonts/source/lilypond/*
The TeX include directory is detected dynamically, but it
can be adjusted with -\b-\b-\b--\b-\b-\b-e\be\be\ben\bn\bn\bna\ba\ba\bab\bb\bb\bbl\bl\bl\ble\be\be\be-\b-\b-\b-t\bt\bt\bte\be\be\bex\bx\bx\bx-\b-\b-\b-p\bp\bp\bpr\br\br\bre\be\be\bef\bf\bf\bfi\bi\bi\bix\bx\bx\bx and -\b-\b-\b--\b-\b-\b-e\be\be\ben\bn\bn\bna\ba\ba\bab\bb\bb\bbl\bl\bl\ble\be\be\be-\b-\b-\b-t\bt\bt\bte\be\be\bex\bx\bx\bx-\b-\b-\b-
configure --prefix=/home/me_myself_and_I/
- In this case, you will have to set MFINPUTS, and TEINPUTS
+ In this case, you will have to set MFINPUTS, and TEXINPUTS
accordingly.
If you want to install GNU LilyPond in _\b/_\bu_\bs_\br_\b/_\bl_\bo_\bc_\ba_\bl, and
Since GNU LilyPond currently is beta, you are advised to
also use
- --enable-debugging
- --enable-checking
- other options include:
- --enable-shared
- Make a shared library (gnu/linux, solaris (?) only )
- --enable-printing
- Enable debugging print routines (lilypond -\b-\b-\b-d\bd\bd\bd option)
+28/Jul/97 LilyPond 0.0.76 2
- --enable-optimise
- Set maximum optimisation
-7/Jul/97 LilyPond 0.0.74 2
+INSTALL(1) LilyPond documentation INSTALL(1)
+ --enable-debugging
+ --enable-checking
+ other options include:
+ --enable-shared
+ Make a shared library (gnu/linux, solaris (?)
+ only )
-INSTALL(1) LilyPond documentation INSTALL(1)
+ --enable-printing
+ Enable debugging print routines (lilypond -\b-\b-\b-d\bd\bd\bd
+ option)
+ --enable-optimise
+ Set maximum optimisation
--enable-profiling
- Compile with support for profiling
+ Compile with support for profiling
--enable-tex-prefix
- Set the directory where texmf lives
+ Set the directory where texmf lives
--enable-tex-dir
- Set then directory tex input is in (detected as a
- subdir of tex-prefix)
+ Set then directory tex input is in (detected as a
+ subdir of tex-prefix)
--enable-mf-dir
- Set then directory tex input is in (idem)
+ Set then directory mf input is in (idem)
- All options are documented in the _\bc_\bo_\bn_\bf_\bi_\bg_\bu_\br_\be help The
- option -\b-\b-\b--\b-\b-\b-e\be\be\ben\bn\bn\bna\ba\ba\bab\bb\bb\bbl\bl\bl\ble\be\be\be-\b-\b-\b-o\bo\bo\bop\bp\bp\bpt\bt\bt\bti\bi\bi\bim\bm\bm\bmi\bi\bi\bis\bs\bs\bse\be\be\be is recommended for Real Life
- usage.
+ All options are documented in the _\bc_\bo_\bn_\bf_\bi_\bg_\bu_\br_\be help
+ The option -\b-\b-\b--\b-\b-\b-e\be\be\ben\bn\bn\bna\ba\ba\bab\bb\bb\bbl\bl\bl\ble\be\be\be-\b-\b-\b-o\bo\bo\bop\bp\bp\bpt\bt\bt\bti\bi\bi\bim\bm\bm\bmi\bi\bi\bis\bs\bs\bse\be\be\be is recommended for
+ Real Life usage.
- If you do
+ If you do
- make all
+ make all
- everything will be compiled, but nothing will be
- installed. The resulting binaries can be found in the
- subdirectories _\bo_\bu_\bt_\b/ (which contain all files generated
- during compilation).
+ everything will be compiled, but nothing will be
+ installed. The resulting binaries can be found
+ in the subdirectories _\bo_\bu_\bt_\b/ (which contain all
+ files generated during compilation).
I\bI\bI\bIN\bN\bN\bNS\bS\bS\bST\bT\bT\bTA\bA\bA\bAL\bL\bL\bLL\bL\bL\bLI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
If you have done a successful make, then a simple
should do the trick.
- [todo. Obsolete; fonts are in distribution now.]
-
Install the musixtex fonts in a directory which TeX and MF
knows (if you are root, look for a directory which
contains the directories with AMS and CM source (*.mf)
files. Create a subdir lilypond or musixtex and copy the
fonts into that). Do not forget to rehash TeX (if
- applicable)
-
- Example: my fonts are in
- _\b/_\bu_\bs_\br_\b/_\bl_\bo_\bc_\ba_\bl_\b/_\bl_\bi_\bb_\b/_\bt_\be_\bx_\bf_\bo_\bn_\bt_\bs_\b/_\bm_\bu_\bs_\bi_\bx_\bt_\be_\bx_\b/, and I have a symlink
- pointing to that in
- _\b/_\bu_\bs_\br_\b/_\bl_\bi_\bb_\b/_\bt_\be_\bx_\bm_\bf_\b/_\bt_\be_\bx_\bm_\bf_\b/_\bf_\bo_\bn_\bt_\bs_\b/_\bs_\bo_\bu_\br_\bc_\be_\b/_\bp_\bu_\bb_\bl_\bi_\bc_\b/
-
-C\bC\bC\bCA\bA\bA\bAV\bV\bV\bVE\bE\bE\bEA\bA\bA\bAT\bT\bT\bTS\bS\bS\bS
- +\bo The -O2 option to gcc triggers a gcc bug on DEC Alpha
- in dstream.cc. You should turn off this flag for this
- file.
-R\bR\bR\bRU\bU\bU\bUN\bN\bN\bNN\bN\bN\bNI\bI\bI\bIN\bN\bN\bNG\bG\bG\bG
- GNU LilyPond does use a lot of resources. For operation
-
-7/Jul/97 LilyPond 0.0.74 3
+28/Jul/97 LilyPond 0.0.76 3
INSTALL(1) LilyPond documentation INSTALL(1)
- you need the following:
+ applicable)
- +\bo A fast computer (a full page of music typically takes
- 1 minute on my 486/66, using the -\b-\b-\b--\b-\b-\b-e\be\be\ben\bn\bn\bna\ba\ba\bab\bb\bb\bbl\bl\bl\ble\be\be\be-\b-\b-\b-c\bc\bc\bch\bh\bh\bhe\be\be\bec\bc\bc\bck\bk\bk\bki\bi\bi\bin\bn\bn\bng\bg\bg\bg
- compile. It's lot slower than most MusiXTeX
- preprocessors)
+ Example: my fonts are in
+ _\b/_\bu_\bs_\br_\b/_\bl_\bo_\bc_\ba_\bl_\b/_\bl_\bi_\bb_\b/_\bt_\be_\bx_\bf_\bo_\bn_\bt_\bs_\b/_\bm_\bu_\bs_\bi_\bx_\bt_\be_\bx_\b/, and I have a symlink
+ pointing to that in
+ _\b/_\bu_\bs_\br_\b/_\bl_\bi_\bb_\b/_\bt_\be_\bx_\bm_\bf_\b/_\bt_\be_\bx_\bm_\bf_\b/_\bf_\bo_\bn_\bt_\bs_\b/_\bs_\bo_\bu_\br_\bc_\be_\b/_\bp_\bu_\bb_\bl_\bi_\bc_\b/. After I copied
+ the files, I ran "texhash"
- +\bo TeX
+ ftp://hprib.lps.u-psud.fr/pub/music_zips/musixtex.zip
- +\bo The MusixTeX fonts (I included those found in
- MusixTeX T.73). Beware, the clef symbol has changed
- position in the Egler version, a.k.a. OpusTeX)
+C\bC\bC\bCA\bA\bA\bAV\bV\bV\bVE\bE\bE\bEA\bA\bA\bAT\bT\bT\bTS\bS\bS\bS
+ +\bo The -O2 option to gcc triggers a gcc bug on DEC
+ Alpha in dstream.cc. You should turn off this
+ flag for this file.
- At this time, GNU LilyPond output looks nice, but is not
- of production quality. If you're not discouraged; this is
- what I type in my xterm:
+E\bE\bE\bEX\bX\bX\bXA\bA\bA\bAM\bM\bM\bMP\bP\bP\bPL\bL\bL\bLE\bE\bE\bE
+ This is what I type in my xterm:
lilypond someinput.ly
tex lelie.tex
R\bR\bR\bRE\bE\bE\bED\bD\bD\bDH\bH\bH\bHA\bA\bA\bAT\bT\bT\bT L\bL\bL\bLI\bI\bI\bIN\bN\bN\bNU\bU\bU\bUX\bX\bX\bX
RedHat Linux users should be able to get a RPM. A spec
- file is in _\bm_\ba_\bk_\be_\b/_\bl_\bi_\bl_\by_\bp_\bo_\bn_\bd_\b._\bs_\bp_\be_\bc. You should be able to
+ file is in _\bm_\ba_\bk_\be_\b/_\bo_\bu_\bt_\b/_\bl_\bi_\bl_\by_\bp_\bo_\bn_\bd_\b._\bs_\bp_\be_\bc. You should be able to
create an rpm as a normal user. Be sure you have a
- ~/.rpmrc, and edit the RPM-dir in _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs_\b._\bm_\ba_\bk_\be
+ ~/.rpmrc, and edit the RPM-dir in _\bV_\ba_\br_\bi_\ba_\bb_\bl_\be_\bs_\b._\bm_\ba_\bk_\be. (If you
+ create the RPM as a normal user the permissions will not
-
-
-7/Jul/97 LilyPond 0.0.74 4
+28/Jul/97 LilyPond 0.0.76 4
INSTALL(1) LilyPond documentation INSTALL(1)
+ be set correctly, unfortunately)
+
W\bW\bW\bWI\bI\bI\bIN\bN\bN\bND\bD\bD\bDO\bO\bO\bOZ\bZ\bZ\bZE\bE\bE\bE
Windows NT:
make windows32
-P\bP\bP\bPL\bL\bL\bLA\bA\bA\bAT\bT\bT\bTF\bF\bF\bFO\bO\bO\bOR\bR\bR\bRM\bM\bM\bMS\bS\bS\bS
- GNU LilyPond (pl 0.0.39) is known to compile on the
- following platforms:
+A\bA\bA\bAU\bU\bU\bUT\bT\bT\bTH\bH\bH\bHO\bO\bO\bOR\bR\bR\bRS\bS\bS\bS
+ Han-Wen Nienhuys <hanwen@stack.nl>
+
+ Jan Nieuwenhuizen <jan@digicash.com>
+
+ Have fun!
+
+
+
+
+
+
- Unix:
- * gnu/linux 2.0.x, g++ 2.7.2[.1]
- * aix 4.1, g++ 2.7.2
- * solaris 2.5, g++ 2.7.2
- Other:
- * windows-nt 4.0, cygnus gnu-windows32 beta17.1 (~=g++ 2.7.2)
- * gnu/linux 2.0.28 X to doze, gcc-go32 (~=g++ 2.7.2) [exec. untested]
-A\bA\bA\bAU\bU\bU\bUT\bT\bT\bTH\bH\bH\bHO\bO\bO\bOR\bR\bR\bRS\bS\bS\bS
- Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
- Have fun!
-7/Jul/97 LilyPond 0.0.74 5
+28/Jul/97 LilyPond 0.0.76 5
+pl 76
+ - mudela version bumped to 0.1
+ - mudela-book
+ - doco updates, now some stuff in LaTeX
+ - junked book.{ly,tex} example
+ - progress indicator
+ - rhythm.ly updated
+ - removed mf sources from distribution due to (c) stuff
+ - allowal of breaks handled cleanly
+ - junked Subtle_reqs, junked Request_iterator. Request
+ iteration now by Voice_element_iterator
+ - Piano_bar, Piano_bar_engraver, Span_score_bar_engraver,
+ Span_score_bar
+ - Swallow_performer
+ - removed Staff_engravers, grouping into Line_group_engraver
+ - Head_column as base for Rest_column,Note_column
+ - Score_column derived from PCol
+ - regurgled Line spacing: interface and implementation
+ separate. Idealspacing moved into Spring_spacer
+ - Gourlay style linespacing
+
pl 75.jcn6
- {lyric,meter,key}-performer
- - span-brace-*
-
-pl 75.jcn5
+ - span-brace-* (Removed again. Such is life)
- doze compile
-
-pl 75.jcn4
- midi output, notes only
-
-pl 75.jcn3
- working midi output -- hacked
+ - doze compile, mingw32 configure (still triggers gcc int. comp err)
-pl 75.jcn2
- - doze compile, mingw32 configure (still triggers gcc ico)
+pl 74pre.jcn2
+ - mi2mu fixes after scott snyder <snyder@d0sgif.fnal.gov> [sss]
+ - mi2mu update for mudela 0.0.61
+ - conflily fixes
-pl 75.jcn1
- - all of the above
+*******
+july 21
pl 75
- inbook.ly & book.tex example.
- natural width: linewidth = -1.0\cm
-pl 74pre.jcn2
- - mi2mu fixes after scott snyder <snyder@d0sgif.fnal.gov> [sss]
- - mi2mu update for mudela 0.0.61
- - conflily fixes
-
pl 74pre.jcn1
- oversimplified midi output thru performer hierarchy
- bf: Spanner::doprint
*******
pl 41
- release
+
pl 40.3
- all of the above
- hw's configure.in
-IMPORTANT:
+This is the toplevel README to LilyPond
+
+
+GNU LilyPond which converts music definition files into visual or
+audio output: it can typeset formatted sheet music in TeX and
+and (mechanical) perfomances to MIDI files.
+
+1. VERSIONING
if you have downloaded a
version, then this is version is *not* meant for producing nice output
(but to keep your patchsets up to date). It might not even compile.
-====================
+2. REQUIREMENTS
+
+For the compilation and running of LilyPond you need some additional
+packages. The most unusual one of this are the mf sources to
+MusixTeX. Please refer to the installation instructions on how to
+obtain and install them.
+
+3. INSTALLATINON
+
+For your convenience, a formatted copy of the INSTALL instructions are
+in the toplevel directory, as INSTALL.text
+
+4. DOCUMENTATION
Please refer to the directory Documentation/ for the real doco.
make doc
-You can also simply read the .pod sources. It is ASCII text. For your
-convenience, a copy of the formatted INSTALL instructions are in
-the toplevel directory, as INSTALL.text
-
-
-======================
+You can also simply read the .pod sources. They are ASCII text.
-NOTE:
+5. COMMENTS
LilyPond is a long way from finished and polished. I do appreciate
criticism, comments, bugreports, patches, etc. Please send e-mail to
-
+
Have fun!
+0.1:
+
+ * versioning stuff (cvt mudela, mudela, etc.)
+
Features you cannot find in the doco as working, should be mentioned here.
This is an assorted collection of stuff that will be done, might be
Most of the items are marked in the code as well, with full explanation.
grep for TODO and ugh/ugr
- * script for unified musicological source:
+ * dots into separate item.
- blah blah latex
- \begin{mudela} c4 d4 e4 f4
- \end{mudela}
+ * lyrics in chords still fuck up.
- * lyrics with chords broken
-
- * Redo MIDI output to use Translators
- - remember more horizontal info than melodics:
+ * add to MIDI output:
- tempo change
- repeat
- slurs
- dynamics etc.
- * pushgroup/popgroup
-
- * strict separation between visual and auditive processing.
+ * rewire acknowledge_element() logic with a process_acknowledged()
- * fix depcy/dept stuff in eg. Beam.
+ * pushgroup/popgroup
* whole head on ledger line
* piano staff
- * decent spacing
-
* implement better breaking algorithm
* update 20 pt table
* enter script priority
- * a Hands on tutorial
+ * a hands on tutorial
PROJECTS
* Decent TeX titledefs (\tempo, \metron, etc. )
+ * lily \tempo
+
* C meter iso 4/4, idem for alla breve, etc.
* textspanner: center position
SCRIPTS = clearlily cpgento genheader make_patch \
lily.efence\
- make_version make_website release convert-mudela show-latest \
- conflily
+ make-version make-website release convert-mudela show-latest \
+ mudela-book conflily
EXTRA_DISTFILES = $(SCRIPTS)
#
-EXECUTABLES=convert-mudela
+EXECUTABLES=convert-mudela mudela-book
localinstall: all
$(INSTALL) -d $(bindir)
$(INSTALL) -m 755 convert-mudela $(bindir)
+ $(INSTALL) -m 755 mudela-book $(bindir)
localuninstall:
- rm -f $(bindir)/convert-mudela
+ rm -f $(bindir)/convert-mudela $(bindir)/mudela-book
--- /dev/null
+#!/bin/sh
+
+#shift;
+if test "x$1" = x;
+then
+ versionfile=".version"
+else
+ versionfile=$1;
+fi
+
+cat $versionfile| sed 's/#.*$//g'|sed 's/\([^ ]*\)[\t ]*=[ \t]*\([^ ]*\)$/#define \1 \"\2\"/g'
+echo
+if [ -z $CXX ]
+then
+ COMPILER=unknown
+else
+ COMPILER="$CXX `$CXX --version`"
+fi
+
+echo "#define COMPILER "\"$COMPILER\"
--- /dev/null
+#!/usr/bin/perl -w
+# stupid script to generate WWW site.
+
+use FileHandle;
+use Getopt::Long;
+my $lily_version;
+my $footstr;
+my $mw_id = "<!make_website!>";
+my $id_str = "make-website 0.2";
+
+sub get_version
+{
+ my ($vstr)=("");
+ open V, "$depth/.version";
+ while (<V>) {
+ s/#.*$//g;
+ next if (/^ *$/);
+ s/^/\$/;
+ s/= *(.*)$/=\"$1\";/;
+ $vstr .= $_;
+ }
+ eval ($vstr);
+
+ $lily_version= "$TOPLEVEL_MAJOR_VERSION.$TOPLEVEL_MINOR_VERSION.$TOPLEVEL_PATCH_LEVEL$TOPLEVEL_MY_PATCH_LEVEL";
+
+ # stupid checks.
+ $lily_version= "$TOPLEVEL_MAJOR_VERSION.$TOPLEVEL_MINOR_VERSION.$TOPLEVEL_PATCH_LEVEL$TOPLEVEL_MY_PATCH_LEVEL";
+
+
+ close V;
+}
+
+sub set_html_footer
+{
+ my $MAILADRESS=$ENV{MAILADRESS};
+ my @pw=(getpwuid($<));
+ my $username=$pw[6];
+
+ $footstr =
+ "\n<hr>Please take me <a href=index.html>back to the index</a>\n<hr>
+<font size=-1>
+This page was generated by <code>" . $id_str . "</code> from lilypond-$lily_version by
+<p>
+<address><br>$username <a href=mailto:$MAILADRESS><<!bla>$MAILADRESS</a>></address>
+<p>" . `date` . "
+<p></font>";
+}
+
+
+# do something, check return status
+sub my_system
+{
+ my (@cmds) = @_;
+ foreach $cmd (@cmds) {
+ my ($ignoreret)=0;
+ if ( $cmd =~ /^-/ ) {
+ $ignoreret = 1;
+ $cmd = substr ($cmd, 1);
+ }
+
+ my $ret = ( system ($cmd));
+ if ($ret) {
+ if ($ignoreret) {
+ print STDERR "ignoring failed command \`$cmd\' (status $ret)\n";
+ }else {
+ print STDERR "\nmake_website: failed on command \`$cmd\' (status $ret)\n";
+ exit 2;
+ }
+ }
+ }
+}
+
+
+local $base="lilypond/";
+local @examples=("multi", "wohltemperirt" ,"standchen", "toccata-fuga-E",
+ "scsii-menuetto", "collisions", "cadenza", "scales");
+
+# rhythm, scales,
+
+
+sub gen_html
+{
+ print "generating HTML\n";
+ my_system "make -kC .. html";
+}
+
+sub ps_to_gif
+{
+ my ($a)=@_;
+
+ if (! -f "$a.ps" ) {
+ my_system("gunzip -c $a.ps.gz > $a.ps");
+ }
+ my_system "gs -q -sDEVICE=ppmraw -sOutputFile=- -r200 -dNOPAUSE $a.ps -c quit |pnmscale 0.5| ppmtogif > $a.gif";
+}
+
+
+sub ps_to_jpeg
+{
+ my ($a)=@_;
+ my $in = "$a.ps";
+
+ my_system "gs -q -sDEVICE=ppmraw -sOutputFile=- -r200 -dNOPAUSE $in -c quit |pnmscale 0.5| cjpeg -grayscale > $a.jpeg";
+}
+
+sub gen_examples
+{
+ print "generating examples: \n";
+ foreach $a (@examples) {
+ $texfile="lelie";
+ $tex = "tex $texfile";
+ if ($a eq "standchen" || $a eq "scsii-menuetto" ) {
+ $tex = "latex $a";
+ $texfile = "$a";
+ }
+
+ if ( ! -f "$a.ly.txt" ) {
+ my_system "ln $depth/input/$a.ly ./$a.ly.txt";
+ }
+ if (! -f "$a.dvi" ) {
+ my_system "lilypond $a;",
+ "$tex", "-mv $texfile.dvi $a.dvi";
+ }
+ if ( ! -f "$a.ps.gz" && ! -f "$a.ps" ) {
+ my_system "dvips -o $a.ps $a.dvi";
+ }
+
+ my_system "mv lelie.midi $a.midi; " if ( -f "lelie.midi" );
+
+ # generate the pixmap at twice the size, then rescale (for antialiasing)
+ if ( ! -f "$a.gif" ) {
+ ps_to_gif($a);
+ }
+ if ( ! -f "$a.ps.gz" ) {
+ my_system "gzip -f $a.ps";
+ }
+ }
+}
+
+my @texstuff = ("mudela-man", "mudela-course");
+
+sub gen_manuals
+{
+ print "generating TeX doco list\n";
+ open HTMLLIST, ">tex_manuals.html";
+ print HTMLLIST "<html><body><title>LilyPond manuals in TeX</title>\n" .
+ "<ul>\n";
+ foreach $a (@texstuff) {
+ my_system( "make -C $depth/Documentation out/$a.dvi");
+ my_system( "dvips $a", "gzip -9f $a.ps");
+ print HTMLLIST "<li><a href=$a.ps.gz>$a.ps.gz</a>";
+ }
+ print HTMLLIST "</ul>";
+ close HTMLLIST;
+}
+
+sub gen_list
+{
+ print "generating HTML list\n";
+ open HTMLLIST, ">example_output.html";
+ print HTMLLIST "<html><body><title>LilyPond examples</title>\n
+These example files are taken from the LilyPond distribution.\n
+LilyPond currently only outputs TeX and MIDI. The pictures and\n
+ PostScript files were generated using TeX, Ghostscript and some graphics tools. \n
+The GIF files have been scaled to eliminate aliasing.";
+ foreach $a (@examples) {
+ $name=$a;
+ print HTMLLIST "<h1>example file: $name</h1>\n<XMP>\n";
+
+ open IF, "$depth/input/$a.ly";
+ input_record_separator IF "%}";
+
+ $desc = <IF>;
+ close IF;
+
+ print HTMLLIST "$desc\n</XMP>";
+
+ $inputf="$a.ly.txt";
+ $giff="$a.gif";
+ $jpegf="$a.jpeg";
+ $pngf = "$a.png";
+ $psf="$a.ps.gz";
+ $midif="$a.midi";
+
+ print HTMLLIST "<ul>";
+
+ print HTMLLIST "<li><a href=$inputf> The input file</a>"
+ if ( -f $inputf );
+
+ print HTMLLIST "<li><a href=$giff>The output (picture)</a>"
+ if ( -f $giff );
+
+ print HTMLLIST "<li><a href=$psf>The output (PS)</a>\n"
+ if ( -f $psf );
+
+ print HTMLLIST "<li><a href=$midif>The output (MIDI)</a>\n"
+ if ( -f $midif );
+ print HTMLLIST "</ul>";
+ }
+ print HTMLLIST "</BODY></HTML>";
+ close HTMLLIST;
+}
+
+sub edit_html
+{
+ print STDERR "adding footer\n";
+
+ OUTER:
+ foreach $a (<*.html>) {
+ open H, "$a";
+ my $sep="</BODY>";
+ input_record_separator H $sep;
+ my $file="";
+
+ while (<H>) {
+ if (/$mw_id/) {
+ close H;
+ next OUTER;
+ }
+ $file .= $_;
+
+ }
+ close H;
+
+ my $subst = $footstr;
+ $subst .= $back if (! $a =~ /index.html/ );
+ $file =~ s/$sep/$subst$sep/g ;
+ $file =~ s/\.gif/\.$image/g;
+ open H, ">$a";
+ print H $mw_id;
+ print H $file;
+ close H;
+ }
+}
+
+sub copy_files
+{
+ print "copying files\n";
+ print `ln -s $depth/out ./docxx` if ( ! -x "docxx" ) ;
+ my_system "cp $depth/TODO ./TODO.txt",
+ "cp $depth/NEWS ./NEWS.txt",
+ "cp ../lelie*gif .";
+}
+
+sub set_images
+{
+ for $a (<*.gif>) {
+ if ($opt_png) {
+ my_system "gif2png -d $a";
+ }
+ if ($opt_jpeg) {
+ my $b=$a;
+ $b =~ s/.gif/.jpeg/;
+ my_system "cjpeg -o $b $a";
+ }
+ }
+}
+
+sub docxx_update
+{
+ my_system "make -C $depth doc++";
+}
+
+sub do_tar
+{
+ print "tarring.\n";
+ $files = join (' ', < *.html *.$image *.ps.gz *.txt *.midi docxx/*>);
+ my_system
+ "-tar vhcf website.tar $files;",
+ "gzip -f9 website.tar;";
+}
+
+sub identify
+{
+ print STDERR "This is " . $id_str . "\n";
+
+}
+sub main
+{
+ identify;
+ GetOptions("jpeg", "gif", "png", "noexamples");
+
+ local $image="gif" ;
+ $image = "png" if ($opt_png);
+ $image = "jpeg" if ($opt_jpeg);
+
+ $depth = "../";
+ my $cwd;
+ chomp($cwd = `pwd`);
+ die "need to be in directory Documentation\n" if ( ! ($cwd =~ /Documentation$/));
+ get_version;
+ set_html_footer;
+
+
+ $depth = "../../";
+
+ chdir ("out");
+ $ENV{"TEXINPUTS"} .= ":$depth/input/:";
+ $ENV{"LILYINCLUDE"} = "$depth/input/";
+
+
+ gen_html;
+ copy_files;
+ if (! $opt_noexamples) {
+ gen_examples;
+ gen_list;
+ }
+ gen_manuals;
+ set_images;
+
+ edit_html;
+ docxx_update;
+ do_tar;
+}
+
+main;
+++ /dev/null
-#!/bin/sh
-
-#shift;
-if test "x$1" = x;
-then
- versionfile=".version"
-else
- versionfile=$1;
-fi
-
-cat $versionfile| sed 's/#.*$//g'|sed 's/\([^ ]*\)[\t ]*=[ \t]*\([^ ]*\)$/#define \1 \"\2\"/g'
-echo
-if [ -z $CXX ]
-then
- COMPILER=unknown
-else
- COMPILER="$CXX `$CXX --version`"
-fi
-
-echo "#define COMPILER "\"$COMPILER\"
+++ /dev/null
-#!/usr/bin/perl -w
-# stupid script to generate WWW site.
-
-use FileHandle;
-use Getopt::Long;
-my $lily_version;
-my $footstr;
-my $mw_id = "<!make_website!>";
-
-sub get_version
-{
- my ($vstr)=("");
- open V, "$depth/.version";
- while (<V>) {
- s/#.*$//g;
- next if (/^ *$/);
- s/^/\$/;
- s/= *(.*)$/=\"$1\";/;
- $vstr .= $_;
- }
- eval ($vstr);
-
- $lily_version= "$TOPLEVEL_MAJOR_VERSION.$TOPLEVEL_MINOR_VERSION.$TOPLEVEL_PATCH_LEVEL$TOPLEVEL_MY_PATCH_LEVEL";
-
- # stupid checks.
- $lily_version= "$TOPLEVEL_MAJOR_VERSION.$TOPLEVEL_MINOR_VERSION.$TOPLEVEL_PATCH_LEVEL$TOPLEVEL_MY_PATCH_LEVEL";
-
-
- close V;
-}
-
-sub set_html_footer
-{
- my $MAILADRESS=$ENV{MAILADRESS};
- my @pw=(getpwuid($<));
- my $username=$pw[6];
-
- $footstr =
- "\n<hr>Please take me <a href=index.html>back to the index</a>\n<hr>
-<font size=-1>
-This page was generated by <code>make_website</code> from lilypond-$lily_version by
-<p>
-<address><br>$username <a href=mailto:$MAILADRESS><<!bla>$MAILADRESS</a>></address>
-<p>" . `date` . "
-<p></font>";
-}
-
-
-# do something, check return status
-sub my_system
-{
- my (@cmds) = @_;
- foreach $cmd (@cmds) {
- my ($ignoreret)=0;
- if ( $cmd =~ /^-/ ) {
- $ignoreret = 1;
- $cmd = substr ($cmd, 1);
- }
-
- my $ret = ( system ($cmd));
- if ($ret) {
- if ($ignoreret) {
- print STDERR "ignoring failed command \`$cmd\' (status $ret)\n";
- }else {
- print STDERR "\nmake_website: failed on command \`$cmd\' (status $ret)\n";
- exit 2;
- }
- }
- }
-}
-
-
-local $base="lilypond/";
-local @examples=("multi", "wohltemperirt" ,"standchen", "toccata-fuga-E",
- "scsii-menuetto", "collisions", "cadenza", "scales", "book");
-
-# rhythm, scales,
-
-
-sub gen_html
-{
- print "generating HTML\n";
- my_system "make -kC .. html";
-}
-
-sub ps_to_gif
-{
- my ($a)=@_;
-
- if (! -f "$a.ps" ) {
- my_system("gunzip -c $a.ps.gz > $a.ps");
- }
- my_system "gs -q -sDEVICE=ppmraw -sOutputFile=- -r200 -dNOPAUSE $a.ps -c quit |pnmscale 0.5| ppmtogif > $a.gif";
-}
-
-
-sub ps_to_jpeg
-{
- my ($a)=@_;
- my $in = "$a.ps";
-
- my_system "gs -q -sDEVICE=ppmraw -sOutputFile=- -r200 -dNOPAUSE $in -c quit |pnmscale 0.5| cjpeg -grayscale > $a.jpeg";
-}
-
-sub gen_examples
-{
- print "generating examples: \n";
- foreach $a (@examples) {
- $texfile="lelie";
- $tex = "tex $texfile";
- if ($a eq "standchen" || $a eq "scsii-menuetto" || $a eq "book" ) {
- $tex = "latex $a";
- $texfile = "$a";
- }
-
- if ( ! -f "$a.ly.txt" ) {
- my_system "ln $depth/input/$a.ly ./$a.ly.txt";
- }
- if (! -f "$a.dvi" ) {
- my_system "lilypond $a;",
- "$tex", "-mv $texfile.dvi $a.dvi";
- }
- if ( ! -f "$a.ps.gz" && ! -f "$a.ps" ) {
- my_system "dvips -o $a.ps $a.dvi";
- }
-
- my_system "mv lelie.midi $a.midi; " if ( -f "lelie.midi" );
-
- # generate the pixmap at twice the size, then rescale (for antialiasing)
- if ( ! -f "$a.gif" ) {
- ps_to_gif($a);
- }
- if ( ! -f "$a.ps.gz" ) {
- my_system "gzip -f $a.ps";
- }
- }
-}
-
-
-sub gen_list
-{
- print "generating HTML list\n";
- open HTMLLIST, ">example_output.html";
- print HTMLLIST "<html><body><title>LilyPond examples</title>\n
-These example files are taken from the LilyPond distribution.\n
-LilyPond currently only outputs TeX and MIDI. The pictures and\n
- PostScript files were generated using TeX, Ghostscript and some graphics tools. \n
-The GIF files have been scaled to eliminate aliasing.";
- foreach $a (@examples) {
- $name=$a;
- print HTMLLIST "<h1>example file: $name</h1>\n<XMP>\n";
-
- open IF, "$depth/input/$a.ly";
- input_record_separator IF "%}";
-
- $desc = <IF>;
- close IF;
-
- print HTMLLIST "$desc\n</XMP>";
-
- $inputf="$a.ly.txt";
- $giff="$a.gif";
- $jpegf="$a.jpeg";
- $pngf = "$a.png";
- $psf="$a.ps.gz";
- $midif="$a.midi";
-
- print HTMLLIST "<ul>";
-
- print HTMLLIST "<li><a href=$inputf> The input file</a>"
- if ( -f $inputf );
-
- print HTMLLIST "<li><a href=$giff>The output (picture)</a>"
- if ( -f $giff );
-
- print HTMLLIST "<li><a href=$psf>The output (PS)</a>\n"
- if ( -f $psf );
-
- print HTMLLIST "<li><a href=$midif>The output (MIDI)</a>\n"
- if ( -f $midif );
- print HTMLLIST "</ul>";
- }
- print HTMLLIST "</BODY></HTML>";
- close HTMLLIST;
-}
-
-sub edit_html
-{
- print STDERR "adding footer\n";
-
- OUTER:
- foreach $a (<*.html>) {
- open H, "$a";
- my $sep="</BODY>";
- input_record_separator H $sep;
- my $file="";
-
- while (<H>) {
- if (/$mw_id/) {
- close H;
- next OUTER;
- }
- $file .= $_;
-
- }
- close H;
-
- my $subst = $footstr;
- $subst .= $back if (! $a =~ /index.html/ );
- $file =~ s/$sep/$subst$sep/g ;
- $file =~ s/\.gif/\.$image/g;
- open H, ">$a";
- print H $mw_id;
- print H $file;
- close H;
- }
-}
-
-sub copy_files
-{
- print "copying files\n";
- print `ln -s $depth/out ./docxx` if ( ! -x "docxx" ) ;
- my_system "cp $depth/TODO ./TODO.txt",
- "cp $depth/NEWS ./NEWS.txt",
- "cp ../lelie*gif .";
-}
-
-sub set_images
-{
- for $a (<*.gif>) {
- if ($opt_png) {
- my_system "gif2png -d $a";
- }
- if ($opt_jpeg) {
- my $b=$a;
- $b =~ s/.gif/.jpeg/;
- my_system "cjpeg -o $b $a";
- }
- }
-}
-
-sub docxx_update
-{
- my_system "make -C $depth doc++";
-}
-
-sub do_tar
-{
- print "tarring.\n";
- $files = join (' ', < *.html *.$image *.ps.gz *.txt *.midi docxx/*>);
- my_system
- "-tar vhcf website.tar $files;",
- "gzip -f9 website.tar;";
-}
-sub identify
-{
- print STDERR "make_website 0.1\n";
-
-}
-sub main
-{
- identify;
- GetOptions("jpeg", "gif", "png", "noexamples");
-
- local $image="gif" ;
- $image = "png" if ($opt_png);
- $image = "jpeg" if ($opt_jpeg);
-
- $depth = "../";
- my $cwd;
- chomp($cwd = `pwd`);
- die "need to be in directory Documentation\n" if ( ! ($cwd =~ /Documentation$/));
- get_version;
- set_html_footer;
-
-
- $depth = "../../";
-
- chdir ("out");
- $ENV{"TEXINPUTS"} .= ":$depth/input/:";
- $ENV{"LILYINCLUDE"} = "$depth/input/";
-
-
- gen_html;
- copy_files;
- if (! $opt_noexamples) {
- gen_examples;
- gen_list;
- }
- set_images;
-
- edit_html;
- docxx_update;
- do_tar;
-}
-
-main;
--- /dev/null
+#!/usr/bin/perl -w
+my $mudcount = 0;
+my $mudela_b = 0;
+my $outdir = "";
+my $outname = "";
+use Getopt::Long;
+
+sub gen_mufile
+{
+ return "$outdir/$outname$mudcount.ly";
+}
+
+sub gen_texfile
+{
+ return "$outdir/$outname$mudcount.tex";
+}
+
+sub close_mudela
+{
+ $mudela_b = 0;
+ if ($fragment_b) {
+ print MUDELA "}\n \\paper { linewidth = -1.0\\cm; } }\n";
+ $fragment_b =0;
+ }
+ if ( $verbatim_b) {
+ print BOOK "\\end{verbatim}\n\\interexample";
+ $verbatim_b =0;
+ }
+ close MUDELA;
+ my $status =0;
+ if ( -f gen_mufile ) {
+ $status = system "diff -q $outdir/book-mudela.ly " . gen_mufile;
+ } else {
+ $status = 1;
+ }
+ if ( $status ) {
+ rename "$outdir/book-mudela.ly", gen_mufile;
+ unlink gen_texfile;
+ }
+
+ if ( ! -f gen_texfile) {
+ system "lilypond ". gen_mufile;
+ rename "lelie.tex", gen_texfile;
+ }
+ print BOOK "\\preexample\\input " . gen_texfile . "\n\\postexample\n";
+
+}
+
+sub open_mudela
+{
+ $mudcount++;
+ $mudela_b = 1 ;
+ open MUDELA, ">$outdir/book-mudela.ly";
+ if ($verbatim_b) {
+ print BOOK "\\begin{verbatim}\n";
+ }
+ if ($fragment_b) {
+ print MUDELA "\\score { \\melodic {";
+ }
+
+}
+
+sub begin_b
+{
+ my ($s) = @_;
+ return (/^\\begin{$s}/) ;
+}
+
+sub end_b
+{
+ my ($s) = @_;
+ return (/^\\end{$s}/) ;
+}
+sub parse_mudela_opts
+{
+ my ($s) = @_;
+ $s =~ s/[\[\]]//g;
+
+ $verbatim_b =1 if ($s =~ /verbatim/ );
+ $fragment_b = 1 if ($s =~ /fragment/ );
+}
+
+sub main
+{
+ GetOptions( 'outdir=s', 'outname=s');
+ $outdir = $opt_outdir;
+ $outname = $opt_outname if (defined ($opt_outname) && $opt_outname);
+ open INFILE, $ARGV[0];
+
+ open BOOK, ">$outdir/$outname";
+ while (<INFILE>) {
+ if ($mudela_b) {
+ if (end_b "mudela") {
+ close_mudela;
+ next;
+ }
+ print MUDELA;
+ if ( $verbatim_b ) {
+ my $s = $_;
+ $s =~ s/\t/ /g; #shit
+ print BOOK $s;
+ }
+
+ } else {
+ if (/^\\begin(\[.*\])?{mudela}/ ) {
+ my $opts ="";
+ $opts = $1 if ( defined ($1));
+
+ parse_mudela_opts($opts);
+ open_mudela;
+ next;
+ }
+ print BOOK;
+ }
+ }
+ close INFILE;
+ close BOOK;
+}
+
+main;
fi
-# Check whether --enable-mingw32 or --disable-mingw32 was given.
-if test "${enable_mingw32+set}" = set; then
- enableval="$enable_mingw32"
+# Check whether --enable-mingw-prefix or --disable-mingw-prefix was given.
+if test "${enable_mingw_prefix+set}" = set; then
+ enableval="$enable_mingw_prefix"
MINGWPREFIX=$enableval
else
MINGWPREFIX=no
EOF
-CXX="$ac_cv_prog_CXX" bin/make_version >> lib/out/config.hh
+CXX="$ac_cv_prog_CXX" bin/make-version >> lib/out/config.hh
touch make/out/Site.make
# ugr
-(cd mi2mu; CXX="$ac_cv_prog_CXX" ../bin/make_version > out/version.hh
+(cd mi2mu; CXX="$ac_cv_prog_CXX" ../bin/make-version > out/version.hh
)
# rgu
sed 's/TOPLEVEL_//g' < .version > lily/.version
-(cd lily; CXX="$ac_cv_prog_CXX" ../bin/make_version > out/version.hh
+(cd lily; CXX="$ac_cv_prog_CXX" ../bin/make-version > out/version.hh
)
-$MAKE -f make/Toplevel.make.in Makefile
+echo '# WARNING : Automatically generated from make/Toplevel.make.in' | cat - make/Toplevel.make.in > Makefile
cat << END
-Finished configuring. For making everything, do:
+For making everything, do:
- make all
-
-If you only want help on the make targets, do a
-
- make help
-
-assuming that \`make' is GNU make, of course.
+ make # GNU make
If you want to make site-wide extensions to the makefiles, please use
make/out/Site.make
-
-If you can't find a toplevel makefile, please execute
-
- make -f make/Toplevel.make.in Makefile # GNU make, of course
END
EOF
-CXX="$ac_cv_prog_CXX" bin/make_version >> lib/out/config.hh
+CXX="$ac_cv_prog_CXX" bin/make-version >> lib/out/config.hh
touch make/out/Site.make
# ugr
-(cd mi2mu; CXX="$ac_cv_prog_CXX" ../bin/make_version > out/version.hh
+(cd mi2mu; CXX="$ac_cv_prog_CXX" ../bin/make-version > out/version.hh
dnl echo 0 > out/.build
)
# rgu
sed 's/TOPLEVEL_//g' < .version > lily/.version
-(cd lily; CXX="$ac_cv_prog_CXX" ../bin/make_version > out/version.hh
+(cd lily; CXX="$ac_cv_prog_CXX" ../bin/make-version > out/version.hh
)
-$MAKE -f make/Toplevel.make.in Makefile
+echo '# WARNING : Automatically generated from make/Toplevel.make.in' | cat - make/Toplevel.make.in > Makefile
cat << END
-Finished configuring. For making everything, do:
+For making everything, do:
- make all
-
-If you only want help on the make targets, do a
-
- make help
-
-assuming that \`make' is GNU make, of course.
+ make # GNU make
If you want to make site-wide extensions to the makefiles, please use
make/out/Site.make
-
-If you can't find a toplevel makefile, please execute
-
- make -f make/Toplevel.make.in Makefile # GNU make, of course
END
MAJOR_VERSION = 1
MINOR_VERSION = 1
-PATCH_LEVEL = 21
+PATCH_LEVEL = 22
# use to send patches, always empty for released version:
MY_PATCH_LEVEL = # include separator: "-1" or ".a"
#
version 1.1:
+pl 22:
+ - ACursor and PACursor to give array a List like interface.
+
pl 21:
pl 20.mb
- bf: Warning about NPRINT only if debugging requested.
-CXX="$ac_cv_prog_CXX" ../bin/make_version > out/version.hh
+CXX="$ac_cv_prog_CXX" ../bin/make-version > out/version.hh
trap '' 1 2 15
cat > confcache <<\EOF
AC_CHECK_FUNCS(memmem snprintf )
AC_CONFIG_HEADER(out/config.hh:config.hh.in)
-CXX="$ac_cv_prog_CXX" ../bin/make_version > out/version.hh
+CXX="$ac_cv_prog_CXX" ../bin/make-version > out/version.hh
AC_OUTPUT(out/Flower-flags.make:Flower-flags.make.in)
--- /dev/null
+/*
+ acursor.hh -- declare ACursor, PACursor
+
+ source file of the Flower Library
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef ACURSOR_HH
+#define ACURSOR_HH
+
+template<class T>
+class ACursor
+{
+protected:
+ int idx_;
+ Array<T> &arr_;
+public:
+ ACursor(ACursor const& s)
+ :arr_(s.arr_)
+ {
+ idx_ = s.idx_;
+ }
+ ACursor(Array<T> const &arr)
+ arr_((Array<T>&)arr)
+ {
+ idx_ =0;
+ }
+ T thing() const {
+ return arr_[idx_];
+ }
+ T& thing() { return arr_[idx_]; }
+ T& operator++(int) {
+ T&t = thing();
+ idx_ ++;
+ return t;
+ }
+ bool ok() { return idx_ >=0 && idx_ < arr_.size(); }
+};
+
+
+template<class T>
+class PACursor : public ACursor<T*>
+{
+public:
+ PACursor(Link_array<T> l)
+ : ACursor(l)
+ {
+ }
+ T* ptr() { return arr_[idx_]; }
+ T *operator->() {
+ return ptr();
+ }
+
+};
+
+#endif // ACURSOR_HH
# auto dependencies:
#
--include $(DEPFILES)
+ifdef DEPFILES
+include $(DEPFILES)
+endif
#
% setup for Request->Element conversion. Guru-only
%
-\requesttranslator {
+staff_engraver = \requesttranslator {
+ Engraver "Engraver_group_engraver"
+ \alias "Staff";
+ \consists "Line_group_engraver";
+ \consists "Bar_engraver";
+ \consists "Clef_engraver";
+ \consists "Key_engraver";
+ \consists "Meter_engraver";
+ \consists "Local_key_engraver";
+ \consists "Staff_sym_engraver";
+ \consists "Collision_engraver";
+ \consists "Rest_collision_engraver";
+ \contains \requesttranslator {
+ Engraver "Voice_group_engravers"
+ \alias "Voice_group";
+ \consists "Dynamic_engraver";
+ \consists "Stem_beam_engraver";
+ \consists "Script_engraver";
+ \consists "Note_column_engraver";
+ \consists "Slur_engraver";
+ \contains \requesttranslator {
+ Engraver "Engraver_group_engraver"
+ \alias "Voice";
+ \consists "Note_head_engraver" ;
+ \consists "Tie_engraver";
+ }
+ }
+ }
+
+piano_staff_engraver = \requesttranslator {
+ Engraver "Engraver_group_engraver"
+ \alias "Piano";
+ \alias "Hoenoemjedat";
+ \consists "Span_bar_engraver";
+ \consists "Vertical_align_engraver";
+ \consists "Line_group_engraver";
+ \consists "Piano_bar_engraver";
+ \contains\requesttranslator { \staff_engraver }
+}
+
+staff_group_engraver = \requesttranslator {
+ Engraver "Engraver_group_engraver"
+ \alias "Staff_group";
+ \consists "Span_bar_engraver";
+ \consists "Vertical_align_engraver";
+ \consists "Line_group_engraver";
+ \contains\requesttranslator { \staff_engraver }
+}
+lyric_engraver = \requesttranslator {
+ Engraver "Engraver_group_engraver"
+ \alias "Lyric";
+
+ \contains\requesttranslator{
+ Engraver "Engraver_group_engraver"
+ \consists "Lyric_engraver";
+ \consists "Line_group_engraver";
+ \consists "Swallow_engraver";
+ }
+ \consists "Vertical_align_engraver";
+}
+
+orchestral_score_translator = \requesttranslator {
Engraver Score_engraver
\alias "Score";
\consists "Key_align_engraver";
\consists "Meter_align_engraver";
\consists "Score_horizontal_align_engraver";
-
\consists "Vertical_align_engraver";
- \consists "Span_bar_engraver";
- \consists "Span_brace_engraver";
-
- \contains\requesttranslator {
- Engraver "Staff_engravers"
- \alias "Staff";
- \consists "Bar_engraver";
- \consists "Clef_engraver";
- \consists "Key_engraver";
- \consists "Meter_engraver";
- \consists "Local_key_engraver";
- \consists "Staff_sym_engraver";
- \consists "Collision_engraver";
- \consists "Rest_collision_engraver";
- \contains \requesttranslator {
- Engraver "Voice_group_engravers"
- \alias "Voice_group";
- \consists "Dynamic_engraver";
- \consists "Stem_beam_engraver";
- \consists "Script_engraver";
- \consists "Note_column_engraver";
- \consists "Slur_engraver";
- \contains \requesttranslator {
- Engraver "Engraver_group_engraver"
- \alias "Voice";
- \consists "Note_head_engraver" ;
- \consists "Tie_engraver";
- }
- }
- }
+ \consists "Span_score_bar_engraver";
- \contains\requesttranslator {
- Engraver "Staff_engravers"
- \alias "Lyric";
- \contains\requesttranslator{
- Engraver "Voice_group_engravers"
- \alias "Voice_group";
- \contains\requesttranslator{
- Engraver "Engraver_group_engraver"
- \consists "Lyric_engraver";
- \consists "Swallow_engraver";
- }
- }
- }
+ \contains \requesttranslator { \staff_group_engraver }
+ \contains \requesttranslator { \lyric_engraver }
+ \contains \requesttranslator { \piano_staff_engraver }
+
+
}
\include "table16.ini"
+\include "engraver.ini"
default_paper = \paper {
linewidth = 15.0 \cm;
interbeam = 2.667\pt;
geometric = 1.414;
\symboltables { \table_sixteen }
- \include "engraver.ini"
+ \requesttranslator { \orchestral_score_translator }
}
% setup for Request->Element conversion. Guru-only
%
-% nice to have, but let's first get some output
-
\requesttranslator {
Performer "Score_performer"
\alias "Score";
\contains\requesttranslator{
Performer "Performer_group_performer"
\consists "Lyric_performer";
- \consists "Key_performer";
\consists "Note_performer";
- \consists "Meter_performer";
- \consists "Silent_performer";
+
}
}
+ \consists "Key_performer";
+ \consists "Meter_performer";
+ \consists "Swallow_performer";
}
}
-\version "0.0.61";
+\version "0.1.0";
\include "dynamic.ini"
\include "dutch.ini"
"bars" = \table {
"empty" "\emptybar"
- "|" "\maatstreep{%}" 0.0\pt 0.64\pt .0\pt 16.0\pt
- "||" "\doublebar{%}" 0.0\pt 4.0\pt .0\pt 16.0\pt
- "|." "\finishbar{%}" -4.0\pt 0.0\pt .0\pt 16.0\pt
- ":|" "\repeatbar" -4.0\pt 0.0\pt .0\pt 16.0\pt
- "|:" "\startrepeat" 0.0\pt 4.0\pt 0.0\pt 16.0\pt
+ "" "" 0.0\pt 0.0\pt 0.0\pt 16.0\pt
+ "|" "\maatstreep{%}" 0.0\pt 0.64\pt 0.0\pt 16.0\pt
+ "||" "\doublebar{%}" 0.0\pt 4.0\pt 0.0\pt 16.0\pt
+ "|." "\finishbar{%}" -4.0\pt 0.0\pt 0.0\pt 16.0\pt
+ ":|" "\repeatbar" -8.0\pt 0.0\pt 0.0\pt 16.0\pt
+ "|:" "\startrepeat" 0.0\pt 8.0\pt 0.0\pt 16.0\pt
":|:" "\repeatbarstartrepeat" 0.0\pt 16.0\pt 0.0\pt 16.0\pt
}
% dims ignored for this table
"param" = \table {
- "brace" "\brace{%}" 0.0\pt 0.0\pt -3.0\pt 3.0\pt
+ "brace" "\pianobrace{%}" 0.0\pt 0.0\pt 0.0\pt 0.0\pt
"meter" "\generalmeter{%}{%}" 0.0\pt 10.0\pt -5.0\pt 5.0\pt
"linestaf" "\linestafsym{%}{%}"
"stem" "\stem{%}{%}"
+++ /dev/null
-%{
-MudelaHeader
-
- filename: book.ly
- title:
- description: demonstrate inclusion of Lily output into (La)TeX
-documents
- composers:
- entered-by:
- copyright:
-
- Tested Features: natural width
-EndMudelaHeader
-%}
-\version "0.0.61";
-
-
-
-\score {\melodic { \clef "bass";
- [c8 g e' d'] [e' g e' g]
- [c a f' e'] [f' a f' a]
- }
-
- \paper {
- \output "bach1.out";
- linewidth =-1.0\cm;
- }
-}
-
-\score {\melodic { \clef "bass";
- [c8() g e'() d'] [e'( g e') g]
- [c() a f' ()e'] [f'( a f') a]
- }
- \paper {
- \output "bach2.out";
- linewidth= -1.0\cm;
- }
-}
-
-\score {\melodic { \clef "bass";
- [c8 g( e' d'] [)e' g( e' )g]
- [c a( f' e'] [)f' a( f' )a]
- }
- \paper {
- \output "bach3.out";
- linewidth = -1.0\cm;
- unitspace = 2.0\cm;
- }
-}
+++ /dev/null
-% should be scriptified, probably
-\documentclass{article}
-\input lilyponddefs
-\title{Bach's Cello suites}
-
-\author{A.U.Thor}
-\begin{document}
-\maketitle
-
-\section{Banjo}
-
-It is normal to have some text around various figures. Such as this
-text which is merely to add some weight to the page. In het midden van
-mei/Als de nachtegaals zingen/En de avondglans huwt/aan de morgense schijn.
-Als de schuchtere geur/ van de bloeiende seringen/zich mengt met de
-geur/van de late jasmijn. Op een tochtje langs de rijn.
-
-\def\EndLilyPondOutput{}
-\begin{figure}[h]
- \begin{center}
- \leavevmode
- \input bach1.out
- \caption{original}
- \end{center}
-\end{figure}
-
-Voglio centocinquante gramme di gorgonzola, tre di questi pannini e due bionde
-ragazze con ciocolatta e panna, per favore. Presto! Non posso parlare
-o scrivere la lingua italiana, ma provo.
-
-\section{Hammond-organ and electric guitar}
-
-It is normal to have some text around various figures. Such as this
-text which is merely to add some weight to the page. In het midden van
-mei/Als de nachtegaals zingen/En de avondglans huwt/aan de morgense schijn.
-Als de schuchtere geur/ van de bloeiende seringen/zich mengt met de
-geur/van de late jasmijn. Op een tochtje langs de rijn.
-
-\begin{figure}[h]
- \begin{center}
- \leavevmode
-\input bach2.out
-
- \caption{interpretation 1}
- \end{center}
-\end{figure}
-
-It is normal to have some text around various figures. Such as this
-text which is merely to add some weight to the page. In het midden van
-mei/Als de nachtegaals zingen/En de avondglans huwt/aan de morgense schijn.
-Als de schuchtere geur/ van de bloeiende seringen/zich mengt met de
-geur/van de late jasmijn. Op een tochtje langs de rijn.
-
-\begin{figure}[h]
- \begin{center}
- \leavevmode
-\input bach3.out
-
- \caption{interpretation 2}
- \end{center}
-\end{figure}
-
-Voglio centocinquante gramme di gorgonzola, tre di questi pannini e due bionde
-ragazze con ciocolatta e panna, per favore. Presto! Non posso parlare
-o scrivere la lingua italiana, ma provo.
-
-\end{document}
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
cad = \melodic {
Tested Features:test the Collision resolution
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
Tested Features:
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
Tested Features: local key, key, forced accidentals
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
blah = \melodic{
Tested Features: example file with comments
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
% the % is a comment.
}
\score{
- \melodic < \multi 3;
-
- \melodie
- \begeleiding
+ \melodic < \id "Piano" ""; \multi 3;
+ \melodie
+ \begeleiding
>
}
%}
-\version "0.0.61";
+\version "0.1.0";
\score{
\melodic
< \multi 2; { \stem -1; c2 c2 } { \stem 1; c'2 c'2 } >
< \multi 3; { \clef "bass"; c2 c2 } { \meter 2/4;\bar "||"; \key fis cis gis; c'2 c'2 } >
c2 c1
-
+ c1 c1
+ < \multi 1; < \multi 3;
+ { \meter 2/4; \clef "violin"; c2 c2 }
+ { \meter 2/4; \clef "bass"; c2 c2 }
+ >
+ < \multi 3;
+ { \meter 2/4; \clef "violin"; c2 c2 }
+ { \meter 2/4; \clef "bass"; c2 c2 }
+ >
+ >
}
}
% \lbheel \lbheel \lfheel \lftoe
% \rbheel \rbtoe \rfheel \rftoe
-\version "0.0.61";
+\version "0.1.0";
\score{
\melodic {
unsynced bars
EndMudelaHeader
%}
-\version "0.0.58";
-%
-% Ive' got rhythm!
-%
-% add any impressive examples here, please
-\version "0.0.58";
-ritme = \staff {
- melodicregs
- \melodic{ %\octave ;
+\version "0.1.0";
+
+ritme = \melodic{ %\octave ;
\partial 8;
\octave c';
\meter 4/4;
}
-}
-another = \staff {
- melodicregs
+
+another =
\melodic{ \meter 4/4;
c1. c1. c4 c4 c4 c4 \meter 4/4; c1 c1 c1
}
-}
-yanother = \staff {
- melodicregs
+
+yanother =
\melodic{ \meter 4/4;
c1 c1 c1 c4 c4 c4 c4 c1 c1 c1
}
-}
+
\score{
- ritme
- another
- yanother
+ < \multi 3;
+ \ritme
+ \another
+ \yanother
+ >
- \midi { }
\paper{
- \unitspace 2\cm
- \geometric 1.3
+ unitspace =2.0\cm;
+ geometric =1.6;
}
}
% scales with accents.
%
-\version "0.0.61";
+\version "0.1.0";
blah = \melodic {
\meter 6/8;
\octave 'c ;
Tested Features: scripts, text.
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
blah = \melodic {
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
%% Stuff from MPP version
% \lefttitle{Menuetto}
\score{
% huh? how to set id_str
- \melodic{ \id "Melodic" "Cello"; \IImenuetto }
+ \melodic{
+ \id "Staff" "Cello"; \IImenuetto
+ }
\paper{
unitspace= 9.0\mm ;% to get lily to use only three lines
geometric= 1.40;
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
\score{
\melodic{\octave c';
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
commands = \melodic{
\skip 2.*4;
}
\score{
- < \multi 3;
+ <
{ \id "Lyric" "1"; \tekstI } % ugh
{ \id "Lyric" "2"; \tekstII }
-
- \melodic < \melodie \commands >
- \melodic < \begeleiding \commands >
+ < \id "Piano" "";
+ \multi 2;
+ \melodic < \melodie \commands >
+ \melodic < \begeleiding \commands >
+ >
>
\paper{
linewidth= 195.\mm;
%}
-\version "0.0.61";
+\version "0.1.0";
toccata_commands = \melodic{
\meter 4/4;
dis4-\rtoe e4-\rheel 'e4-\ltoe |
}
-break = \melodic{ \meter 4/4; r1 }
+break = \melodic{
+ %\meter 4/4;
+ r1
+}
% these should be two separate scores...
\score{
- \melodic < \multi 3;
+ \melodic < \multi 1;
- {\$toccata_right \break \$fuga2_right }
- {\$toccata_left \break \$fuga2_left }
+ < \id Piano ""; \multi 3;
+ {\$toccata_right \break \$fuga2_right }
+ { \$toccata_left \break \$fuga2_left }
+ >
- {\$toccata_pedal \break \$fuga2_pedal }
+ { \$toccata_pedal \break \$fuga2_pedal }
+
>
\paper{}
Tested Features: lyrics
EndMudelaHeader
%}
-\version "0.0.61";
+\version "0.1.0";
melody = \melodic{
\clef violin;
\score{
< \multi 3;
- \melodic <\global \melody >
+ \melodic <
+ \id "Piano" "";\multi 3;
+ < \global
+ \melody >
+ < \global
+ \accompany >
+ >
% ugh
\lyric < \id "Lyric" "1"; \global \tekst \hegedraagjetekst >
% \lyric < \id "Lyric" "2"; \global \texte >
% \lyric < \id "Lyric" "3"; \global \texti \textii \textiii >
- \melodic < \global \accompany >
+
>
\paper{
unitspace= 2.5\cm;
%}
-\version "0.0.61";
+\version "0.1.0";
% should add \need{dutch.ini} for
% correct parsing of note names
\score {
- \melodic < \multi 1;
+ \melodic < \id "Piano" "";
+ \multi 1;
< \multi 2;
\global
\dux
>
>
- \paper{}
+ \paper{
+% unitspace = 40.0\pt; geometric = 1.6;
+ geometric= 1.4; unitspace= 34.\pt;
+ }
\midi {
\tempo 4:84;
}
MAJOR_VERSION = 0
MINOR_VERSION = 0
-PATCH_LEVEL = 75
+PATCH_LEVEL = 76
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-MY_PATCH_LEVEL = .jcn5
+MY_PATCH_LEVEL =
#include "bar.hh"
#include "command-request.hh"
#include "time-description.hh"
+#include "engraver-group.hh"
Bar_engraver::Bar_engraver()
{
if (bar_p_){
announce_element(Score_elem_info(bar_p_, bar_req_l_) );
+ } else {
+ Disallow_break_req r;
+ daddy_grav_l_->try_request(&r);
}
}
if (bar_breaks[i][1] == type_str_)
type_str_ = bar_breaks[i][break_status_i()+1];
}
-
- transparent_b_ = empty_b_ = (type_str_ == "");
+
+ // span_score_bar needs dims.
+// transparent_b_ = empty_b_ = (type_str_ == "");
}
sb.translate(Offset(x, (x * slope + left_pos)* inter_f));
mol_p->add(sb);
}
- mol_p->translate_x(x0 - left_col_l_->hpos);
+ mol_p->translate_x(x0 - left_col_l_->hpos_f_);
return mol_p;
}
Spanner::do_print();
#endif
}
-/*
- duh. The stem is not a dependency but a dependent
- */
+
void
-Beam::do_substitute_dependency(Score_elem*o,Score_elem*n)
+Beam::do_substitute_dependent(Score_elem*o,Score_elem*n)
{
if (o->is_type_b( Stem::static_name() )) {
stems.substitute( (Stem*)o->item(), n?(Stem*) n->item():0);
#include "break.hh"
#include "paper-def.hh"
-#include "linespace.hh"
+#include "line-spacer.hh"
#include "debug.hh"
#include "scoreline.hh"
#include "p-score.hh"
Break_algorithm::find_breaks() const
{
Line_of_cols retval;
- for (iter_top(pscore_.cols,c); c.ok(); c++) {
+ for (iter_top(pscore_l_->col_p_list_,c); c.ok(); c++) {
if (c->breakable_b())
retval.push(c);
}
return retval;
}
-
-void
-Break_algorithm::generate_spacing_problem(Line_of_cols curline, Spacing_problem & sp)const
+
+Line_spacer*
+Break_algorithm::generate_spacing_problem(Line_of_cols curline)const
{
- sp.add_column(curline[0], true, 0.0);
+ Line_spacer * sp= (*get_line_spacer)();
+ sp->paper_l_ = pscore_l_->paper_l_;
+ sp->add_column(curline[0], true, 0.0);
for (int i=1; i< curline.size()-1; i++)
- sp.add_column(curline[i]);
+ sp->add_column(curline[i]);
if ( linelength > 0)
- sp.add_column(curline.top(), true, linelength);
+ sp->add_column(curline.top(), true, linelength);
else
- sp.add_column(curline.top());
+ sp->add_column(curline.top());
+ return sp;
}
Col_hpositions
Break_algorithm::stupid_solution(Line_of_cols curline)const
{
- Spacing_problem sp;
- generate_spacing_problem(curline, sp);
- Col_hpositions colhpos;
- colhpos.cols = curline;
- colhpos.energy = INFTY;
- colhpos.ugh_b_ = true;
- colhpos.config = sp.try_initial_solution();
- return colhpos;
+ Line_spacer *sp =generate_spacing_problem(curline);
+ Col_hpositions colhpos;
+ colhpos.cols = curline;
+ colhpos.energy = INFTY;
+ colhpos.ugh_b_ = true;
+ colhpos.config = sp->default_solution();
+ delete sp;
+ return colhpos;
}
/// construct an appropriate Spacing_problem and solve it.
Col_hpositions
Break_algorithm::solve_line(Line_of_cols curline) const
{
- Spacing_problem sp;
- generate_spacing_problem(curline, sp);
-
- // misschien moeven uit Spacing_problem?
- for (iter_top(pscore_.suz,i); i.ok(); i++) {
- sp.add_ideal(i);
- }
- sp.prepare();
+ Line_spacer *sp = generate_spacing_problem(curline);
+ sp->prepare();
- Array<Real> the_sol=sp.solve();
- Col_hpositions col_hpos;
- col_hpos.cols = curline;
- col_hpos.energy = the_sol.pop();
- col_hpos.config = the_sol;
- col_hpos.error_col_l_arr_ = sp.error_pcol_l_arr();
- col_hpos.OK();
- return col_hpos;
+ Array<Real> the_sol=sp->solve();
+ Col_hpositions col_hpos;
+ col_hpos.cols = curline;
+ col_hpos.energy = the_sol.pop();
+ col_hpos.config = the_sol;
+ col_hpos.error_col_l_arr_ = sp->error_pcol_l_arr();
+ col_hpos.OK();
+ delete sp;
+
+ return col_hpos;
}
Break_algorithm::Break_algorithm(PScore&s)
- :pscore_(s)
{
+ pscore_l_ = &s;
+ get_line_spacer =0;
linelength = s.paper_l_->linewidth_f();
}
void
Break_algorithm::problem_OK() const
{
- if (!pscore_.cols.size())
+ if (!pscore_l_->col_p_list_.size())
error("Score does not have any columns");
+ OK();
+}
+
+void
+Break_algorithm::OK()const
+{
#ifndef NDEBUG
- iter_top(pscore_.cols,start);
- PCursor<PCol *> end (pscore_.cols.bottom());
+ iter_top(pscore_l_->col_p_list_,start);
+ PCursor<PCol *> end (pscore_l_->col_p_list_.bottom());
assert(start->breakable_b());
assert(end->breakable_b());
Array<Col_hpositions>
Break_algorithm::solve()const
{
-
return do_solve();
}
+++ /dev/null
-/*
- calcideal.cc -- implement Score::calc_idealspacing()
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "idealspacing.hh"
-#include "score.hh"
-#include "p-score.hh"
-#include "paper-def.hh"
-#include "score-column.hh"
-#include "dimen.hh"
-
-
-/**
- generate springs between columns.
-
- TODO: This needs A LOT of rethinking. Spacing should take optical
- effects into account, should be local (measure wide), should check
- smallest divisions.
-
- plus, calc_idealspacing() should be called per line.
- */
-void
-Score::calc_idealspacing()
-{
- iter_top(cols_,i);
-
- for (; i.ok(); i++) {
- if (!i->used_b())
- continue;
-
- PCursor<Score_column*> j(i+1);
-
- if (i->musical_b()) {
- assert(j.ok());
- for (int n=0; n < i->durations.size(); n++) {
- Moment d = i->durations[n];
- Real dist = paper_p_->duration_to_dist(d);
- Real strength = i->durations[0]/i->durations[n];
- assert(strength <= 1.0);
-
- while (j.ok()) {
- if (j->used_b() && j->when() >= d + i->when() )
- break;
- j++;
- }
- Moment delta_desired = j->when() - (d+i->when());
- dist += paper_p_->duration_to_dist(delta_desired);
- if (!j->musical_b())
- dist += 1 PT; // ugh
- pscore_p_->connect(i->pcol_l_, j->pcol_l_, dist, strength);
- }
- } else if (j.ok()) {
- while (!j->used_b())
- j++;
-
- /* attach i to the next column in use. This exists, since
- the last col is breakable, and therefore in use
- */
-
- Moment d = j->when() - i->when();
- Real dist = (d) ? paper_p_->duration_to_dist(d) : 2 PT; // todo
-
- pscore_p_->connect(i->pcol_l_, j->pcol_l_, dist, (d) ? 1.0:1.0);
- }
- // !j.ok() might hold if we're at the last col.
- }
-}
-
-
--- /dev/null
+/*
+ col-info.cc -- implement Colinfo
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "p-col.hh"
+#include "col-info.hh"
+#include "debug.hh"
+
+void
+Colinfo::print() const
+{
+#ifndef NPRINT
+ mtor << "column { ";
+ if (fixed())
+ mtor << "fixed at " << fixed_position()<<", ";
+ assert(pcol_l_);
+ mtor << "[" << minleft() << ", " << minright() << "]";
+ mtor <<"}\n";
+#endif
+}
+
+Colinfo::Colinfo(PCol *col_l, Real const *fixed_C)
+{
+ if (fixed_C)
+ fixpos_p_.set_l(fixed_C);
+ ugh_b_ = false;
+ pcol_l_ = col_l;
+ width = pcol_l_->width();
+}
+
+
+Colinfo::Colinfo()
+{
+ ugh_b_ = false;
+ pcol_l_ =0;
+}
+
void
Command_req::do_print()const{}
+
+IMPLEMENT_IS_TYPE_B1(Disallow_break_req,Command_req);
+IMPLEMENT_STATIC_NAME(Disallow_break_req);
+void
+Disallow_break_req::do_print()const
+{
+}
/* *************** */
IMPLEMENT_STATIC_NAME(Barcheck_req);
IMPLEMENT_IS_TYPE_B1(Barcheck_req,Timing_req);
if ( new_cresc_p ) {
cresc_p_ = new_cresc_p;
- cresc_p_->left_col_l_ = get_staff_info().musical_l()->pcol_l_;
+ cresc_p_->left_col_l_ = get_staff_info().musical_l();
if (dynamic_p_) {
cresc_p_->left_dyn_b_ = true;
}
if (dynamic_p_)
to_end_cresc_p_->right_dyn_b_=true;
- to_end_cresc_p_->right_col_l_ = get_staff_info().musical_l()->pcol_l_;
+ to_end_cresc_p_->right_col_l_ = get_staff_info().musical_l();
to_end_cresc_p_->set_staffsym(s_l);
typeset_element(to_end_cresc_p_);
to_end_cresc_p_ = 0;
void
Engraver::post_move_processing()
{
-
if (status < CREATION_INITED) {
do_creation_processing();
status = CREATION_INITED;
Global_translator::prepare(Moment)
{
}
+
+IMPLEMENT_STATIC_NAME(Global_translator);
+IMPLEMENT_IS_TYPE_B1(Global_translator, Translator);
--- /dev/null
+/*
+ head-column.cc -- implement Head_column
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "debug.hh"
+#include "head-column.hh"
+#include "note-head.hh"
+#include "stem.hh"
+
+Head_column::Head_column()
+{
+ stem_l_ = 0;
+ dir_i_ =0;
+}
+
+void
+Head_column::do_substitute_dependency(Score_elem*o,
+ Score_elem*n)
+{
+ Script_column::do_substitute_dependency(o,n);
+ if (o->name() == Note_head::static_name()) {
+ head_l_arr_.substitute( (Note_head*)o->item(),
+ (n)? (Note_head*)n->item() : 0);
+ }
+ if (stem_l_ == o) {
+ stem_l_ = n ? (Stem*)n->item():0;
+ }
+}
+
+
+void
+Head_column::set(Stem*stem_l)
+{
+ stem_l_ = stem_l;
+ add_dependency(stem_l);
+}
+
+void
+Head_column::add(Note_head *n_l)
+{
+ add_support(n_l);
+ head_l_arr_.push(n_l);
+}
+
+
+IMPLEMENT_STATIC_NAME(Head_column);
+IMPLEMENT_IS_TYPE_B1(Head_column,Script_column);
+
+void
+Head_column::do_print() const
+{
+#ifndef NPRINT
+ mtor << "heads: " << head_l_arr_.size();
+#endif
+}
+
+void
+Head_column::do_pre_processing()
+{
+ if (!dir_i_){
+ if (stem_l_)
+ dir_i_ = stem_l_->dir_i_;
+ }
+ Script_column::do_pre_processing();
+}
+/*
+ idealspacing.cc -- implement Idealspacing
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
#include "idealspacing.hh"
#include "p-col.hh"
#include "p-score.hh"
{
#ifndef NPRINT
mtor << "idealspacing {" ;
- mtor << "distance "<<space<< " strength " << hooke ;
- mtor << "left " << left->rank_i() << " right " << right->rank_i() << "}\n";
+ mtor << "distance "<<space_f_<< " strength " << hooke_f_ ;
+ mtor << "left " << left_i_ << " right " << right_i_ << "}\n";
#endif
}
-Idealspacing::Idealspacing(PCol const * l,PCol const * r)
+Idealspacing::Idealspacing()
{
- space = 0.0;
- hooke = 0.0;
- left = l;
- right = r;
+ space_f_ = 0.0;
+ hooke_f_ = 0.0;
+ left_i_ = -1;
+ right_i_ = -1;
}
void
Idealspacing::OK() const
{
-#ifndef NDEBUG
- assert(hooke >= 0 && left && right);
-#endif
+ assert(hooke_f_ >= 0);
}
DEFAULT_PRINT(Script_id, General_script_def, script);
DEFAULT_PRINT(Lookup_id, Lookup, lookup);
+DEFAULT_PRINT(Input_translator_id, Input_trans, input_translator);
DEFAULT_PRINT(Symtables_id, Symtables, symtables);
DEFAULT_PRINT(Music_id,Music , music);
DEFAULT_PRINT(Request_id, Request, request);
DEFAULT_PRINT(Score_id, Score, score);
-DEFAULT_PRINT(Input_trans_id, Input_translator, itrans);
DEFAULT_PRINT(Midi_def_id,Midi_def, mididef);
DEFAULT_PRINT(Paper_def_id,Paper_def, paperdef);
Idclass::Idclass(String s, Class*st, int code):Identifier(s,code) { data = st; }\
-
+implement_id_class(Input_translator_id, Input_translator, input_translator);
implement_id_class(Int_id, int, intid);
implement_id_class(Real_id, Real, real);
implement_id_class(Script_id, General_script_def, script);
implement_id_class(Music_id, Music, music);
implement_id_class(Score_id, Score, score);
implement_id_class(Request_id, Request, request);
-implement_id_class(Input_trans_id, Input_translator, itrans);
implement_id_class(Midi_def_id, Midi_def, mididef);
implement_id_class(Paper_def_id, Paper_def, paperdef);
{
assert(false);
}
-
+default_accessor(Input_translator_id,Input_translator, input_translator);
default_accessor(Int_id, int, intid);
default_accessor(Real_id, Real, real);
virtual_accessor(Script_id, General_script_def, script);
virtual_accessor(Music_id, Music, music);
default_accessor(Score_id, Score, score);
virtual_accessor(Request_id, Request, request);
-default_accessor(Input_trans_id, Input_translator, itrans);
default_accessor(Midi_def_id, Midi_def, mididef);
default_accessor(Paper_def_id, Paper_def, paperdef);
virtual void set_default_dir();
virtual void do_pre_processing();
virtual void do_post_processing();
- virtual void do_substitute_dependency(Score_elem*, Score_elem*);
+ virtual void do_substitute_dependent(Score_elem*, Score_elem*);
virtual void do_print() const;
*/
class Break_algorithm {
- void generate_spacing_problem(Line_of_cols,Spacing_problem&)const;
+ Line_spacer* generate_spacing_problem(Line_of_cols)const;
protected:
- PScore &pscore_;
+ PScore *pscore_l_;
Real linelength;
/// search all pcols which are breakable.
Col_hpositions stupid_solution(Line_of_cols) const;
virtual Array<Col_hpositions> do_solve()const=0;
public:
+ Line_spacer* (*get_line_spacer)();
+
Break_algorithm(PScore&);
/// check if the spacing/breaking problem is well-stated
void problem_OK()const;
-
+ void OK()const;
Array<Col_hpositions> solve()const;
};
-/// wordwrap type algorithm: move to next line if current is optimal.
-struct Word_wrap : Break_algorithm {
- virtual Array<Col_hpositions> do_solve()const;
- Word_wrap(PScore&);
-};
#endif // BREAK_HH
--- /dev/null
+/*
+ col-info.hh -- declare
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef COL_INFO_HH
+#define COL_INFO_HH
+
+#include "lily-proto.hh"
+#include "pointer.hh"
+#include "interval.hh"
+
+/// helper struct for #Spacing_problem#
+struct Colinfo {
+ PCol *pcol_l_;
+ P<Real> fixpos_p_;
+ Interval width;
+ int rank_i_;
+ /// did some tricks to make this column come out.
+ bool ugh_b_;
+ /* *************** */
+ Colinfo();
+ Colinfo(PCol *,Real const *);
+
+ void print() const;
+ bool fixed() const { return fixpos_p_.get_C();}
+ Real fixed_position()const { return *fixpos_p_; }
+ Real minright() const { return width.right; }
+ Real minleft() const { return -width.left; }
+};
+
+#endif // COL_INFO_HH
virtual Meter_change_req * meterchange() { return 0; }
virtual Bar_req *bar() { return 0; }
virtual Cadenza_req *cadenza() { return 0; }
+ virtual Disallow_break_req *disallowbreak() { return 0; }
virtual Timing_req*timing() { return 0; }
virtual Command_script_req*commandscript() { return 0;}
};
};
+class Disallow_break_req : public Command_req {
+public:
+ REQUESTMETHODS(Disallow_break_req, disallowbreak);
+};
+
/** Baseclass for meter/partial req. It has to be handled by
Staff_{walker,column} baseclass. */
virtual bool removable_b()const;
public:
+ virtual void print() const { Engraver::print(); }
+
Input_translator * itrans_l_;
void check_removal();
Engraver_group_engraver();
Moment last_mom_;
public:
Score *score_l_;
+
Global_translator();
int moments_left_i()const;
void modify_next(Moment&);
virtual void finish() {}
virtual void start() {}
+ NAME_MEMBERS();
protected:
+
virtual Global_translator *global_l() { return this; }
virtual int depth_i() const;
virtual Translator *ancestor_l(int);
--- /dev/null
+/*
+ head-column.hh -- declare Head_column
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef HEAD_COLUMN_HH
+#define HEAD_COLUMN_HH
+
+#include "script-column.hh"
+
+class Head_column : public Script_column
+{
+public:
+ Link_array<Note_head> head_l_arr_;
+ /** The relative position of the "voice" containing this
+ chord. Normally this would be the same as the stem direction,
+ but rests do not have stems.
+
+ Hmm. outdated.. Rests *do* have stems.
+ */
+
+ int dir_i_;
+ Stem* stem_l_;
+
+ void add(Note_head*);
+ void add(Script*s) { Script_column::add(s) ; }
+ virtual void set(Stem*);
+ Head_column();
+ NAME_MEMBERS();
+protected:
+
+
+ virtual void do_pre_processing();
+ virtual void do_print()const;
+ virtual void do_substitute_dependency(Score_elem*,Score_elem*);
+};
+#endif // HEAD_COLUMN_HH
struct Idealspacing {
/// the ideal distance
- Real space;
+ Real space_f_;
/// Hooke's constant: how strong are the "springs" attached to columns
- Real hooke;
+ Real hooke_f_;
/// the two columns
- PCol const *left, *right;
+ int left_i_;
+ int right_i_;
void print()const;
void OK() const ;
- Idealspacing(PCol const *left,PCol const *right);
+ Idealspacing();
};
void print()const;
NAME_MEMBERS();
void error(String);
+ IDACCESSOR(Input_translator, input_translator)
IDACCESSOR(Music, music)
- IDACCESSOR(Input_translator, itrans)
IDACCESSOR(General_script_def, script)
IDACCESSOR(Symtables, symtables)
IDACCESSOR(Midi_def, mididef)
}\
-
+declare_id_class(Input_translator_id, Input_translator, input_translator);
declare_id_class(Real_id, Real, real);
declare_id_class(Script_id, General_script_def, script);
declare_id_class(Lookup_id, Lookup, lookup);
declare_id_class(Int_id, int, intid);
declare_id_class(Score_id, Score, score);
declare_id_class(Request_id, Request, request);
-declare_id_class(Input_trans_id, Input_translator, itrans);
declare_id_class(Paper_def_id,Paper_def, paperdef);
declare_id_class(Midi_def_id,Midi_def, mididef);
#endif // IDENTIFIER_
{
Input_translator_list(Input_translator_list const &);
Input_translator_list(){}
+ ~Input_translator_list(){}
};
struct Input_translator : Input {
struct Crescendo ;
struct Decresc_req;
struct Directional_spanner;
+struct Disallow_break_req;
struct Durational_req;
struct Dynamic;
struct Dynamic_req;
struct Global_translator;
struct Group_change_req;
struct Group_feature_req;
+struct Head_column;
struct Horizontal_align_item;
struct Horizontal_group;
struct Horizontal_group_item;
struct Lily_stream;
struct Line_of_score;
struct Line_of_staff;
+struct Line_spacer;
struct Linestaff;
struct Local_key;
struct Local_key_item;
struct Slur_engraver;
struct Slur_req;
struct Spacing_req ;
-struct Spacing_problem;
struct Span_dynamic_req;
struct Span_req;
struct Spanner;
+struct Spring_spacer;
struct Staff_performer;
struct Staff_side;
struct Staff_symbol;
--- /dev/null
+/*
+ line-spacer.hh -- declare Line_spacer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef LINE_SPACER_HH
+#define LINE_SPACER_HH
+#include "lily-proto.hh"
+#include "varray.hh"
+#include "vector.hh"
+#include "interval.hh"
+
+/**
+ abstract interface to Line spacing.
+
+ TODO
+ add estimate of "force" or energy.
+ */
+
+class Line_spacer
+{
+
+public:
+ Paper_def * paper_l_;
+ Paper_def *paper_l()const;
+ Line_spacer();
+
+ virtual Array<PCol*> error_pcol_l_arr() const=0;
+
+ /** solve the spacing problem
+
+ @return the column positions, and the energy (last element)
+
+ */
+ virtual Array<Real> solve() const=0;
+
+ /** add a col to the problem. columns have to be added left to
+ right. The column contains info on it's minimum width. */
+ virtual void add_column(PCol *, bool fixed=false, Real fixpos=0.0)=0;
+
+ /**
+ can the posed problem be solved?
+
+ @pre
+
+ prepare() was called
+
+ */
+ virtual bool check_constraints(Vector v) const=0;
+
+ /**
+ generate a solution which can't fail
+ */
+ virtual Vector default_solution() const=0;
+
+ virtual void OK() const{}
+ virtual void print() const{}
+
+ /**
+ Call after construction before solving
+ */
+ virtual void prepare(){}
+};
+
+#endif
(c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
+#error
#ifndef LINESPACE_HH
#define LINESPACE_HH
#include "interval.hh"
#include "pointer.hh"
-/// helper struct for #Spacing_problem#
-struct Colinfo {
- PCol *pcol_l_;
- P<Real> fixpos_p_;
- Interval width;
- int rank_i_;
- /// did some tricks to make this column come out.
- bool ugh_b_;
- /* *************** */
- Colinfo();
- Colinfo(PCol *,Real const *);
-
- void print() const;
- bool fixed() const { return fixpos_p_.get_C();}
- Real fixed_position()const { return *fixpos_p_; }
- Real minright() const { return width.right; }
- Real minleft() const { return -width.left; }
-};
-
/** the problem, given by the columns (which include constraints) and
intercolumn spacing. The problem is:
*/
class Spacing_problem {
- Array<Idealspacing const *> ideals;
+ PointerList<Idealspacing *> ideal_p_list_;
Array<Colinfo> cols;
Array<Colinfo> loose_col_arr_;
void handle_loose_cols();
void position_loose_cols(Vector &) const;
-public:
- Array<PCol*> error_pcol_l_arr() const;
-
- /** solve the spacing problem
-
- @return the column positions, and the energy (last element)
-
- */
- Array<Real> solve() const;
-
-
- /**
+ /**
add a idealspacing to the problem.
One pair of columns can have no, one or more idealspacings,
not in this problem, the spacing is ignored.
*/
void add_ideal(Idealspacing const *i);
-
-
- /** add a col to the problem. columns have to be added left to right. The column contains
- info on it's minimum width.
- */
- void add_column(PCol *, bool fixed=false, Real fixpos=0.0);
-
+ void print_ideal(Idealspacing const *)const;
+ Vector try_initial_solution() const;
+ void calcideal();
+ Score_column* scol_l(int);
+ void connect(int i,int j, Real,Real);
+public:
+ static Line_spacer *constructor() {
+ return new Line_spacer;
+ }
+ Array<PCol*> error_pcol_l_arr() const;
- bool check_constraints(Vector v) const;
+ virtual Array<Real> solve() const;
+ virtual void add_column(PCol *, bool fixed=false, Real fixpos=0.0);
+
- Vector try_initial_solution() const;
- void OK() const;
- void print() const;
- void print_ideal(Idealspacing const *)const;
- void prepare();
+ virtual Vector default_solution() contains {
+ return try_initial_solution() ;
+ }
+ virtual bool check_constraints(Vector v) const;
+ virtual void OK() const;
+ virtual void print() const;
+ virtual void prepare();
};
-
-
-#endif
#include "lily-proto.hh"
class Lyric_engraver : public Engraver {
- Array<Lyric_req*> lreq_arr_;
+ Lyric_req* lreq_l_;
+ Text_item *lyric_item_p_;
+protected:
+ virtual void do_pre_move_processing();
virtual bool do_try_request(Request*);
virtual void do_process_requests();
virtual void do_post_move_processing();
virtual Translator * get_req_translator_l();
};
-// duh.
-class Request_iterator : public Music_iterator {
- Request *req_l_;
- bool last_b_;
-public:
- Request_iterator(Request const *);
- NAME_MEMBERS();
-protected:
- virtual bool ok() const;
- virtual Moment next_moment() const;
-
- virtual void do_print()const;
- virtual void process_and_next(Moment);
-};
-
class Change_iterator : public Music_iterator {
Change_reg * change_l_;
public:
const Chord *chord_C_;
Pointer_list<Music_iterator*> children_p_list_;
public:
+ ~Chord_iterator();
Chord_iterator(Chord const*);
NAME_MEMBERS();
protected:
virtual bool ok()const;
};
-class Voice_element_iterator : public Chord_iterator {
-
-protected:
- virtual void construct_children();
+class Voice_element_iterator : public Music_iterator {
+ const Voice_element * elt_l_;
+ Moment elt_duration_;
+ bool last_b_;
public:
Voice_element_iterator(Voice_element*);
NAME_MEMBERS();
+
+protected:
+ virtual void process_and_next(Moment);
+ virtual Moment next_moment()const;
+ virtual void construct_children();
+ virtual bool ok()const;
+ virtual void do_print()const;
};
virtual Dynamic_req* dynamic() { return 0; }
virtual Absolute_dynamic_req * absdynamic() { return 0; }
virtual Tie_req * tie() { return 0; }
- virtual Subtle_req * subtle() { return 0; }
virtual Span_dynamic_req * span_dynamic() { return 0; }
REQUESTMETHODS(Musical_req, musical);
};
};
-/** A helper in the hierarchy. Each dynamic is bound to one note ( a
- crescendo spanning multiple notes is thought to be made of two
- "dynamics": a start and a stop). Dynamic changes can occur in a
- smaller time than the length of its note, therefore fore each
- Dynamic request carries a time, measured from the start of its
- note.
- */
-class Subtle_req : public virtual Musical_req {
-public:
- /// the time relative to Voice_element start.
- Moment subtime_;
- REQUESTMETHODS(Subtle_req, subtle);
-};
-
-class Dynamic_req : public Subtle_req {
+class Dynamic_req : public virtual Musical_req {
public:
/// for absolute dynamics
enum Loudness {
#ifndef NOTE_COLUMN_HH
#define NOTE_COLUMN_HH
+
#include "item.hh"
-#include "script-column.hh"
+#include "head-column.hh"
/** a struct for treating a group of noteheads (noteheads, stem
(chord) and scripts ) as a single entity. */
-class Note_column : public Script_column {
+class Note_column : public Head_column {
protected:
virtual void do_pre_processing();
- virtual void do_substitute_dependency(Score_elem*,Score_elem*);
-public:
- /// link to the stem. For setting default direction
- Stem * stem_l_;
+public:
bool h_shift_b_;
- Link_array<Note_head> head_l_arr_;
Interval_t<int> head_positions_interval()const;
-
- /** The relative position of the "voice" containing this
- chord. Normally this would be the same as the stem direction,
- but rests do not have stems. */
- int dir_i_;
-
NAME_MEMBERS();
Note_column();
- void add(Note_head *);
- void add(Stem *);
+ virtual void set(Stem *);
void sort();
- void add(Script* s) { Script_column::add(s);}
};
#endif // NOTE_COLUMN_HH
/** if lines are broken then this column x-coord #hpos# if not
known, then hpos == -1.(ugh?) */
- Real hpos; // should use ptr?
+ Real hpos_f_; // should use ptr?
bool error_mark_b_;
bool used_b_ ; // manual override..
bool breakable_b()const;
Interval width() const;
- ~PCol();
- PCol(PCol * parent);
+ virtual ~PCol();
+ PCol();
/**
which col comes first?.
void set_rank(int);
void OK() const;
- void set_breakable();
+ void set_breakable();
+ virtual void do_set_breakable();
void print()const;
private:
Paper_def *paper_l_;
/// the columns, ordered left to right
- Pointer_list<PCol *> cols;
+ Pointer_list<PCol *> col_p_list_;
/// the idealspacings, no particular order
- Pointer_list<Idealspacing*> suz;
+ Pointer_list<Idealspacing*> suz_p_list_;
/// crescs etc; no particular order
- Pointer_list<Spanner *> spanners;
+ Pointer_list<Spanner *> span_p_list_;
/// other elements
Pointer_list<Score_elem*> elem_p_list_;
/* UTILITY ROUTINES */
- /// get the spacing between c1 and c2, create one if necessary.
- Idealspacing* get_spacing(PCol *c1, PCol *c2);
-
- /// connect c1 and c2
- void do_connect(PCol *c1, PCol *c2, Real distance_f, Real strength_f);
-
- /// connect c1 and c2 and any children of c1 and c2
- void connect(PCol* c1, PCol *c2, Real distance_f,Real strength_f= 1.0);
/* STANDARD ROUTINES */
void OK()const;
/// before calc_breaking
void preprocess();
+ void calc_idealspacing();
/// calculate where the lines are to be broken, and use results
void calc_breaking();
#define REST_COLUMN_HH
#include "script-column.hh"
+#include "head-column.hh"
/**
struct to treat a set of rests as union (one voicegroup should
only produce one rest.
*/
-class Rest_column : public Script_column {
- Link_array<Note_head> head_l_arr_;
+class Rest_column : public Head_column {
public:
- int dir_i_;
- Stem* stem_l_;
- void add(Note_head *);
- void add(Stem *);
NAME_MEMBERS();
- Rest_column();
void translate_heads(int dy);
-protected:
- virtual void do_print() const;
- virtual void do_substitute_dependency(Score_elem*, Score_elem*);
};
#endif // REST_COLUMN_HH
#include "lily-proto.hh"
#include "varray.hh"
#include "moment.hh"
-
+#include "p-col.hh"
/**
*/
-class Score_column {
+class Score_column : public PCol {
friend class Score;
friend class Score_engraver;
bool musical_b_;
Moment when_;
- void set_breakable();
public:
- /// indirection to column
- PCol * pcol_l_;
-
/// length of notes/rests in this column
Array<Moment> durations;
Moment when() { return when_; }
Score_column(Moment when);
- static int compare(Score_column & c1, Score_column &c2);
void add_duration(Moment );
void preprocess();
- bool breakable_b();
bool musical_b() { return musical_b_; }
- bool used_b();
void print() const;
+ virtual void do_set_breakable();
};
-#include "compare.hh"
-
-instantiate_compare(Score_column&, Score_column::compare);
-
#endif // SCORE_COLUMN_HH
DELETED, // to catch malloc mistakes.
};
- Status status;
+ Status status_;
public:
PScore *pscore_l_;
Interval height() const;
virtual void translate_x(Real);
virtual void translate_y(Real);
+ Status status() const;
/**
translate the symbol. The symbol does not have to be created yet.
void unlink();
void unlink_all();
+ void substitute_dependency(Score_elem*,Score_elem*);
void remove_dependency(Score_elem*);
/**
add a dependency. It may be the 0 pointer, in which case, it is ignored.
virtual Item * item() { return 0; }
virtual Line_of_score * line_l() const;
SCORE_ELEM_CLONE(Score_elem);
+ Score_elem* dependency(int) const;
+ Score_elem* dependent(int) const;
+ int dependent_size() const;
+ int dependency_size() const;
+
+ /// no dimension, translation is noop
+ bool empty_b_;
+ /// do not print anything black
+ bool transparent_b_;
protected:
virtual Interval do_height()const;
virtual void handle_broken_dependencies();
virtual void handle_prebroken_dependencies();
- Score_elem* dependency(int) const;
- Score_elem* dependent(int) const;
- int dependent_size() const;
- int dependency_size() const;
- /// no dimension, translation is noop
- bool empty_b_;
- /// do not print anything black
- bool transparent_b_;
};
public Engraver_group_engraver, public Global_translator
{
Line_of_score * scoreline_l_;
+ bool disallow_break_b_;
+ int breaks_i_;
Array<Item*> nobreak_item_p_arr_;
#define SCORE_HALIGN_GRAV_HH
#include "engraver.hh"
class Score_horizontal_align_engraver : public Engraver {
-
Break_align_item * halign_p_;
public:
NAME_MEMBERS();
Paper_def *paper_p_;
Midi_def *midi_p_;
Music * music_p_;
-
-
- Pointer_list<Score_column*> cols_;
PScore *pscore_p_;
int errorlevel_i_;
///
void set(Paper_def* midi_p);
- // standard
- void OK() const;
void print() const;
- /// find a column.
- PCursor<Score_column *> find_col(Moment,bool);
-
Score(Score const&);
-
private:
+
+
+
void run_translator(Global_translator*);
void midi_output();
void paper_output();
+++ /dev/null
-/*
- silent-performer.hh -- declare Silent_performer
-
- (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
- */
-
-#ifndef SILENT_PERFORMER_HH
-#define SILENT_PERFORMER_HH
-
-#include "performer.hh"
-
-/**
-*/
-
-class Silent_performer : public Performer {
-public:
- NAME_MEMBERS();
-
- Silent_performer();
- ~Silent_performer();
-
- virtual bool try_request( Request *req_l ) ;
-};
-
-#endif // SILENT_PERFORMER_HH
Vertical_align_element * valign_l_;
public:
NAME_MEMBERS();
+
+ Span_bar_engraver();
+protected:
+
virtual void acknowledge_element(Score_elem_info);
virtual void do_pre_move_processing();
- Span_bar_engraver();
-
+ virtual Span_bar* get_span_bar_p()const;
};
#endif // SPAN_BAR_GRAV_HH
SCORE_ELEM_CLONE(Span_bar);
void add(Bar* );
void set( Vertical_align_element *);
- void do_pre_processing();
- void do_substitute_dependency(Score_elem*,Score_elem*);
- Molecule * brew_molecule_p()const;
+
+protected:
+ virtual Interval do_width()const;
+ virtual void do_pre_processing();
+ virtual void translate_y(Real y);
+
+ virtual void do_substitute_dependency(Score_elem*,Score_elem*);
+ virtual Molecule * brew_molecule_p()const;
+ virtual Symbol get_bar_sym(Real dy) const;
};
+
#endif // SPAN_BAR_HH
+++ /dev/null
-/*
- span-brace-engraver.hh -- declare Span_brace_engraver
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-
-#ifndef SPAN_BRACE_GRAV_HH
-#define SPAN_BRACE_GRAV_HH
-
-#include "engraver.hh"
-
-class Span_brace_engraver : public Engraver
-{
-public:
- NAME_MEMBERS();
- Span_brace_engraver();
- ~Span_brace_engraver();
-
- virtual void acknowledge_element( Score_elem_info i );
- virtual void do_pre_move_processing();
-
-private:
- Span_brace_item* span_brace_p_;
- Array<Bar*> bar_l_arr_;
- Vertical_align_element* valign_l_;
-};
-
-#endif // SPAN_BRACE_GRAV_HH
+++ /dev/null
-/*
- span-brace-item.hh -- declare Span_brace_item
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
-*/
-
-
-#ifndef SPAN_BRACE_ITEM_HH
-#define SPAN_BRACE_ITEM_HH
-
-#include "bar.hh"
-
-class Span_brace_item : public Item
-{
-public:
- NAME_MEMBERS();
- SCORE_ELEM_CLONE(Span_brace_item);
-
- void add( Bar* bar_l );
- void set( Vertical_align_element* vae_l );
- void do_pre_processing();
- void do_substitute_dependency( Score_elem*, Score_elem* );
- Molecule* brew_molecule_p() const;
-
-private:
- Link_array<Bar> spanning_l_arr_;
-};
-
-#endif // SPAN_BRACE_ITEM_HH
--- /dev/null
+/*
+ span-score-bar-grav.hh -- declare Span_score_bar_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef SPAN_SCORE_BAR_GRAV_HH
+#define SPAN_SCORE_BAR_GRAV_HH
+
+#include "span-bar-grav.hh"
+
+class Span_score_bar_engraver : public Span_bar_engraver
+{
+public:
+ NAME_MEMBERS();
+ virtual Span_bar* get_span_bar_p()const;
+};
+
+/**
+ Please don't shoot the piano player
+ */
+class Piano_bar_engraver : public Span_score_bar_engraver
+{
+public:
+ NAME_MEMBERS();
+ virtual Span_bar * get_span_bar_p() const;
+};
+
+#endif // SPAN_SCORE_BAR_GRAV_HH
--- /dev/null
+/*
+ span-score-bar.hh -- declare Span_score_bar
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef SPAN_SCORE_BAR_HH
+#define SPAN_SCORE_BAR_HH
+
+#include "span-bar.hh"
+
+class Span_score_bar : public Span_bar
+{
+public:
+ NAME_MEMBERS();
+ SCORE_ELEM_CLONE(Span_score_bar);
+ Span_score_bar();
+protected:
+
+
+ virtual void do_pre_processing();
+};
+
+
+class Piano_brace : public Span_score_bar
+{
+public:
+ NAME_MEMBERS();
+ SCORE_ELEM_CLONE(Piano_brace);
+protected:
+ virtual Interval do_width()const;
+ virtual Symbol get_bar_sym(Real) const;
+};
+
+#endif // SPAN_SCORE_BAR_HH
--- /dev/null
+/*
+ spring-spacer.hh -- declare Spring_spacer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef SPRING_SPACER_HH
+#define SPRING_SPACER_HH
+
+#include "line-spacer.hh"
+#include "plist.hh"
+#include "col-info.hh"
+
+/** the problem, given by the columns (which include constraints) and
+ intercolumn spacing. The problem is:
+
+ Generate a spacing which
+ \begin{itemize}
+ \item
+ Satisfies spacing constraints (notes can't be printed through each other)
+ \item
+ Looks good, ie tries to conform to an ideal spacing as much as possible.
+ \end{itemize}
+ This is converted by regarding idealspacing as "springs" attached
+ to columns. The equilibrium of one spring is the ideal
+ distance. The columns have a size, this imposes "hard" constraints
+ on the distances. This transforms the problem into a quadratic
+ programming problem with linear constraints.
+
+ The quality is given by the total potential energy in the
+ springs. The lower the energy, the better the configuration.
+
+ TODO: make item widths work per pstaff.
+
+*/
+
+class Spring_spacer : public Line_spacer {
+ friend class Durations_iter;
+
+ Pointer_list<Idealspacing *> ideal_p_list_;
+ Array<Colinfo> cols;
+ Array<Colinfo> loose_col_arr_;
+
+ /// mark column #i# as being loose.
+ void loosen_column(int i);
+ /// the index of #c# in #cols#
+ int col_id(PCol const *c) const;
+
+ /// generate an (nonoptimal) solution
+ Vector find_initial_solution() const;
+
+ /// check if problem is too tight
+ bool check_feasible() const;
+
+ /// does #this# contain the column #w#?
+ bool contains(PCol const *w);
+
+ /// make the energy function
+ void make_matrices(Matrix &quad, Vector &lin,Real&) const;
+
+ /// generate the LP constraints
+ void make_constraints(Mixed_qp& lp) const;
+
+
+ void handle_loose_cols();
+ void position_loose_cols(Vector &) const;
+ /**
+ add a idealspacing to the problem.
+
+ One pair of columns can have no, one or more idealspacings,
+ since they can be "summed" if the columns to which #i# refers are
+ not in this problem, the spacing is ignored.
+ */
+ void add_ideal(Idealspacing const *i);
+ Vector try_initial_solution() const;
+ void calc_idealspacing();
+
+ Score_column* scol_l(int);
+ void connect(int i,int j, Real,Real);
+public:
+ static Line_spacer *constructor();
+ Array<PCol*> error_pcol_l_arr() const;
+
+ virtual Array<Real> solve() const;
+ virtual void add_column(PCol *, bool fixed=false, Real fixpos=0.0);
+
+
+ virtual Vector default_solution() const;
+ virtual bool check_constraints(Vector v) const;
+ virtual void OK() const;
+ virtual void print() const;
+ virtual void prepare();
+};
+
+#endif // SPRING_SPACER_HH
/*
- staff-gravs.hh -- declare Staff_engravers
+ staff-gravs.hh -- declare Line_group_engraver
source file of the GNU LilyPond music typesetter
/**
Engravers which manage a Staff (one 5-line linestaff)
-
- */
-class Staff_engravers : public Engraver_group_engraver {
+ */
+class Line_group_engraver : public Engraver{
Line_of_staff *staffline_p_;
Link_array<Score_elem> staff_elem_l_arr_;
- void group_staff_elems();
protected:
- virtual void do_pre_move_processing();
virtual void do_creation_processing();
virtual void do_removal_processing();
- virtual void typeset_element(Score_elem*);
- virtual void typeset_breakable_item( Item * it_p);
+ virtual void acknowledge_element(Score_elem_info);
public:
-
NAME_MEMBERS();
- Staff_engravers();
+ Line_group_engraver();
};
#endif // STAFF_GRAVS_HH
--- /dev/null
+/*
+ swallow-perf.hh -- declare Swallow_performer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef SWALLOW_PERF_HH
+#define SWALLOW_PERF_HH
+
+#include "performer.hh"
+
+class Swallow_performer : public Performer {
+public:
+ NAME_MEMBERS();
+ virtual bool try_request (Request* ) { return true; }
+};
+
+#endif // SWALLOW_PERF_HH
virtual Global_translator *global_l() { return 0; }
/// Score_register = 0, Staff_registers = 1, etc)
+ virtual void print()const;
virtual int depth_i()const=0;
virtual bool is_bottom_engraver_b() const { return false; }
virtual bool try_request(Request*);
--- /dev/null
+/*
+ word-wrap.hh -- declare Word_wrap
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef WORD_WRAP_HH
+#define WORD_WRAP_HH
+
+#include "break.hh"
+
+/// wordwrap type algorithm: move to next line if current is optimal.
+struct Word_wrap : Break_algorithm {
+ virtual Array<Col_hpositions> do_solve()const;
+ Word_wrap(PScore&);
+};
+
+#endif // WORD_WRAP_HH
Real
Item::hpos_f()const
{
- return pcol_l_->hpos + offset().x;
+ return pcol_l_->hpos_f_ + offset().x;
}
--- /dev/null
+/*
+ line-spacer.cc -- implement
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#include "line-spacer.hh"
+
+Line_spacer::Line_spacer()
+{
+ paper_l_ =0;
+}
+Paper_def*
+Line_spacer::paper_l()const
+{
+
+
+ return paper_l_ ;
+}
+++ /dev/null
-#include <math.h>
-#include "linespace.hh"
-#include "p-col.hh"
-#include "debug.hh"
-#include "qlp.hh"
-#include "unionfind.hh"
-#include "idealspacing.hh"
-#include "pointer.tcc"
-
-const Real COLFUDGE=1e-3;
-template class P<Real>; // ugh.
-
-bool
-Spacing_problem::contains(PCol const *w)
-{
- for (int i=0; i< cols.size(); i++)
- if (cols[i].pcol_l_ == w)
- return true;
- return false;
-}
-
-int
-Spacing_problem::col_id(PCol const *w)const
-{
- for (int i=0; i< cols.size(); i++)
- if (cols[i].pcol_l_ == w)
- return i;
- assert(false);
- return -1;
-}
-
-void
-Spacing_problem::OK() const
-{
-#ifndef NDEBUG
- for (int i = 1; i < cols.size(); i++)
- assert(cols[i].rank_i_ > cols[i-1].rank_i_);
- for (int i = 1; i < loose_col_arr_.size(); i++)
- assert(loose_col_arr_[i].rank_i_ > loose_col_arr_[i-1].rank_i_);
-#endif
-}
-
-/**
- Make sure no unconnected columns happen.
- */
-void
-Spacing_problem::handle_loose_cols()
-{
- Union_find connected(cols.size());
- Array<int> fixed;
- for (int i=0; i < ideals.size(); i++) {
- assert(ideals[i]->hooke > 0);
- int l = col_id(ideals[i]->left);
- int r = col_id(ideals[i]->right);
- connected.connect(l,r);
- }
- for (int i = 0; i < cols.size(); i++)
- if (cols[i].fixed())
- fixed.push(i);
- for (int i=1; i < fixed.size(); i++)
- connected.connect(fixed[i-1], fixed[i]);
-
- for (int i = cols.size(); i--; ) {
- if (! connected.equiv(fixed[0], i)) {
- warning("unconnected column: " + String(i));
- loosen_column(i);
- }
- }
- OK();
-}
-
-
-/** Guess a stupid position for loose columns. Put loose columns at
- regular distances from enclosing calced columns */
-void
-Spacing_problem::position_loose_cols(Vector &sol_vec)const
-{
- if (!loose_col_arr_.size())
- return ;
- assert(sol_vec.dim());
- Array<bool> fix_b_arr;
- fix_b_arr.set_size(cols.size() + loose_col_arr_.size());
- Real utter_right_f=-INFTY;
- Real utter_left_f =INFTY;
- for (int i=0; i < loose_col_arr_.size(); i++) {
- fix_b_arr[loose_col_arr_[i].rank_i_] = false;
- }
- for (int i=0; i < cols.size(); i++) {
- int r= cols[i].rank_i_;
- fix_b_arr[r] = true;
- utter_right_f = utter_right_f >? sol_vec(i);
- utter_left_f = utter_left_f <? sol_vec(i);
- }
- Vector v(fix_b_arr.size());
- int j =0;
- int k =0;
- for (int i=0; i < v.dim(); i++) {
- if (fix_b_arr[i]) {
- assert(cols[j].rank_i_ == i);
- v(i) = sol_vec(j++);
- } else {
- Real left_pos_f =
- (j>0) ?sol_vec(j-1) : utter_left_f;
- Real right_pos_f =
- (j < sol_vec.dim()) ? sol_vec(j) : utter_right_f;
- int left_rank = (j>0) ? cols[j-1].rank_i_ : 0;
- int right_rank = (j<sol_vec.dim()) ? cols[j].rank_i_ : sol_vec.dim();
-
- int d_r = right_rank - left_rank;
- Colinfo loose=loose_col_arr_[k++];
- int r = loose.rank_i_ ;
- assert(r > left_rank && r < right_rank);
-
- v(i) = (r - left_rank)*left_pos_f/ d_r +
- (right_rank - r) *right_pos_f /d_r;
- }
- }
- sol_vec = v;
-}
-
-bool
-Spacing_problem::check_constraints(Vector v) const
-{
- int dim=v.dim();
- assert(dim == cols.size());
-
- for (int i=0; i < dim; i++) {
-
- if (cols[i].fixed()&&
- abs(cols[i].fixed_position() - v(i)) > COLFUDGE)
- return false;
-
- if (!i)
- continue;
-
- Real mindist=cols[i-1].minright()
- +cols[i].minleft();
-
- // ugh... compares
- Real dif =v(i) - v(i-1)- mindist;
- bool b = (dif > - COLFUDGE);
-
-
- if (!b)
- return false;
-
- }
- return true;
-}
-
-void
-Spacing_problem::prepare()
-{
- handle_loose_cols();
-}
-
-bool
-Spacing_problem::check_feasible() const
-{
- Vector sol(try_initial_solution());
- return check_constraints(sol);
-}
-
-/// generate a solution which obeys the min distances and fixed positions
-Vector
-Spacing_problem::try_initial_solution() const
-{
- int dim=cols.size();
- Vector initsol(dim);
- for (int i=0; i < dim; i++) {
- if (cols[i].fixed()) {
- initsol(i)=cols[i].fixed_position();
-
- if (i > 0) {
- Real r =initsol(i-1) + cols[i-1].minright();
- if (initsol(i) < r ) {
- warning("overriding fixed position");
- initsol(i) =r;
- }
- }
-
- } else {
- Real mindist=cols[i-1].minright()
- +cols[i].minleft();
- if (mindist < 0.0)
- warning("Excentric column");
- initsol(i)=initsol(i-1)+mindist;
- }
- }
-
- return initsol;
-}
-
-
-
-Vector
-Spacing_problem::find_initial_solution() const
-{
- Vector v(try_initial_solution());
- assert(check_constraints(v));
- return v;
-}
-
-// generate the matrices
-void
-Spacing_problem::make_matrices(Matrix &quad, Vector &lin, Real &c) const
-{
- quad.fill(0);
- lin.fill(0);
- c = 0;
- for (int j=0; j < ideals.size(); j++){
- Idealspacing const*i=ideals[j];
- int l = col_id(i->left);
- int r = col_id(i->right);
-
- quad(r,r) += i->hooke;
- quad(r,l) -= i->hooke;
- quad(l,r) -= i->hooke;
- quad(l,l) += i->hooke;
-
- lin(r) -= i->space*i->hooke;
- lin(l) += i->space*i->hooke;
-
- c += sqr(i->space);
- }
-}
-
-// put the constraints into the LP problem
-void
-Spacing_problem::make_constraints(Mixed_qp& lp) const
-{
- int dim=cols.size();
- for (int j=0; j < dim; j++) {
- Colinfo c=cols[j];
- if (c.fixed()) {
- lp.add_fixed_var(j,c.fixed_position());
- }
- if (j > 0){
- Vector c1(dim);
-
- c1(j)=1.0 ;
- c1(j-1)=-1.0 ;
- lp.add_inequality_cons(c1, cols[j-1].minright() +
- cols[j].minleft());
- }
- }
-}
-
-Array<Real>
-Spacing_problem::solve() const
-{
- assert(check_feasible());
- print();
-
- Mixed_qp lp(cols.size());
- make_matrices(lp.quad,lp.lin, lp.const_term);
- make_constraints(lp);
- Vector start=find_initial_solution();
- Vector sol(lp.solve(start));
- if (!check_constraints(sol)) {
- WARN << "solution doesn't satisfy constraints.\n" ;
- }
- Real energy_f =lp.eval(sol);
- position_loose_cols(sol);
-
- Array<Real> posns(sol);
-
- posns.push(energy_f);
- return posns;
-}
-
-/**
- add one column to the problem.
-*/
-void
-Spacing_problem::add_column(PCol *col, bool fixed, Real fixpos)
-{
- Colinfo c(col,(fixed)? &fixpos : 0);
- if (cols.size())
- c.rank_i_ = cols.top().rank_i_+1;
- else
- c.rank_i_ = 0;
- cols.push(c);
-}
-
-Array<PCol*>
-Spacing_problem::error_pcol_l_arr()const
-{
- Array<PCol*> retval;
- for (int i=0; i< cols.size(); i++)
- if (cols[i].ugh_b_)
- retval.push(cols[i].pcol_l_);
- for (int i=0; i < loose_col_arr_.size(); i++) {
- retval.push(loose_col_arr_[i].pcol_l_);
- }
- return retval;
-}
-
-void
-Spacing_problem::loosen_column(int i)
-{
- Colinfo c=cols.get(i);
- for (int i=0; i < ideals.size(); ) {
- Idealspacing const *i_l =ideals[i];
- if (i_l->left == c.pcol_l_ || i_l->right == c.pcol_l_)
- ideals.del(i);
- else
- i++;
- }
- c.ugh_b_ = true;
-
- int i=0;
- for (; i < loose_col_arr_.size(); i++) {
- if (loose_col_arr_[i].rank_i_ > c.rank_i_)
- break;
- }
- loose_col_arr_.insert(c,i);
-}
-
-void
-Spacing_problem::add_ideal(Idealspacing const *i)
-{
- PCol const *l =i->left;
- PCol const *r= i->right;
-
- if (!contains(l) || !contains(r)) {
- return;
- }
- ideals.push(i);
-}
-
-void
-Spacing_problem::print_ideal(Idealspacing const *id)const
-{
-#ifndef NPRINT
- int l = col_id(id->left);
- int r = col_id(id->right);
-
- mtor << "between " << l <<","<<r<<":" ;
- id->print();
-#endif
-}
-
-void
-Spacing_problem::print() const
-{
-#ifndef NPRINT
- for (int i=0; i < cols.size(); i++) {
- mtor << "col " << i<<' ';
- cols[i].print();
- }
- for (int i=0; i < ideals.size(); i++) {
- print_ideal(ideals[i]);
- }
-#endif
-
-}
-
-/* **************** */
-
-void
-Colinfo::print() const
-{
-#ifndef NPRINT
- mtor << "column { ";
- if (fixed())
- mtor << "fixed at " << fixed_position()<<", ";
- assert(pcol_l_);
- mtor << "[" << minleft() << ", " << minright() << "]";
- mtor <<"}\n";
-#endif
-}
-
-Colinfo::Colinfo(PCol *col_l, Real const *fixed_C)
-{
- if (fixed_C)
- fixpos_p_.set_l(fixed_C);
- ugh_b_ = false;
- pcol_l_ = col_l;
- width = pcol_l_->width();
-}
-
-
-Colinfo::Colinfo()
-{
- ugh_b_ = false;
- pcol_l_ =0;
-}
for(int i=0; i < support_l_arr_.size(); i++)
key_item_p->add_support(support_l_arr_[i]);
+ announce_element(Score_elem_info(key_item_p, 0)); // ugh ugh ugh
typeset_element(key_item_p);
}
return s;
}
+/*
+ should be handled via TeX code and Lookup::bar()
+ */
Symbol
-Lookup::vbrace( Real &y ) const
+Lookup::vbrace(Real &y) const
{
- if ( y < 2 * 20 PT ) {
- warning( "staff brace too small (" + print_dimen( y ) + ")" );
- y = 2 * 20 PT;
+ if (y < 2* 20 PT) {
+ warning ( "piano brace too small (" + print_dimen(y)+ ")");
+ y = 2*20 PT;
}
- if ( y > 2 * 67 PT ) {
- warning( "staff brace too big (" + print_dimen( y ) + ")" );
- y = 2 * 67 PT;
+ if (y > 67 * 2 PT) {
+ warning ( "piano brace too big (" + print_dimen(y)+ ")");
+ y = 67 *2 PT;
}
- int idx = int( rint( y/2.0 - 20 ) );
+ int idx = int(rint((y/2.0 - 20 ) + 148));
Symbol s = (*symtables_)("param")->lookup("brace");
-
- Array<String> a;
- a.push(idx);
- s.tex = substitute_args(s.tex,a);
- s.dim.y = Interval(0,y);
+ {
+ Array<String> a;
+ a.push(idx);
+ s.tex = substitute_args(s.tex,a);
+ s.dim.y = Interval(0,y);
+ }
+ {
+ Array<String> a;
+ a.push(print_dimen( y/2 ));
+ a.push(print_dimen(0));
+ a.push(s.tex);
+ s.tex = substitute_args("\\placebox{%}{%}{%}", a);
+ }
+
+
return s;
}
+++ /dev/null
-/*
- lyric-engraver.cc -- implement Lyric_engraver
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#include "lyric-engraver.hh"
-#include "musical-request.hh"
-#include "text-item.hh"
-#include "paper-def.hh"
-#include "lookup.hh"
-
-Lyric_engraver::Lyric_engraver()
-{
-}
-
-bool
-Lyric_engraver::do_try_request(Request*r)
-{
- Musical_req * m =r->musical();
- if (!m || ! m->lreq_l())
- return false;
- lreq_arr_.push(m->lreq_l());
-
- return true;
-}
-
-void
-Lyric_engraver::do_process_requests()
-{
- Text_item * last_item_l =0;
- for (int i=0; i < lreq_arr_.size(); i++) {
- Text_item *lp = new Text_item(lreq_arr_[i]->tdef_p_ );
- lp->dir_i_ = -1;
- lp->fat_b_ = true;
- if (last_item_l)
- lp->add_support(last_item_l);
- last_item_l = lp;
- typeset_element(lp);
- }
-}
-
-void
-Lyric_engraver::do_post_move_processing()
-{
- lreq_arr_.set_size(0);
-}
-
-
-IMPLEMENT_STATIC_NAME(Lyric_engraver);
-IMPLEMENT_IS_TYPE_B1(Lyric_engraver,Engraver);
-ADD_THIS_ENGRAVER(Lyric_engraver);
--- /dev/null
+/*
+ lyric-engraver.cc -- implement Lyric_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "lyric-engraver.hh"
+#include "musical-request.hh"
+#include "text-item.hh"
+#include "paper-def.hh"
+#include "lookup.hh"
+
+Lyric_engraver::Lyric_engraver()
+{
+ lreq_l_ =0;
+ lyric_item_p_ =0;
+}
+
+bool
+Lyric_engraver::do_try_request(Request*r)
+{
+ Musical_req * m =r->musical();
+ if (!m || ! m->lreq_l())
+ return false;
+ lreq_l_ = m->lreq_l();
+
+ return true;
+}
+
+void
+Lyric_engraver::do_process_requests()
+{
+ if ( lreq_l_ ) {
+ lyric_item_p_ = new Text_item(lreq_l_->tdef_p_ );
+ lyric_item_p_->dir_i_ = -1;
+ lyric_item_p_->fat_b_ = true;
+ announce_element( Score_elem_info( lyric_item_p_, lreq_l_));
+ }
+}
+
+void
+Lyric_engraver::do_post_move_processing()
+{
+ lreq_l_ =0;
+}
+
+void
+Lyric_engraver::do_pre_move_processing()
+{
+ if ( lyric_item_p_ ){
+ typeset_element( lyric_item_p_);
+ lyric_item_p_ =0;
+ }
+}
+
+IMPLEMENT_STATIC_NAME(Lyric_engraver);
+IMPLEMENT_IS_TYPE_B1(Lyric_engraver,Engraver);
+ADD_THIS_ENGRAVER(Lyric_engraver);
IMPLEMENT_STATIC_NAME(Music_iterator);
IMPLEMENT_IS_TYPE_B(Music_iterator);
+Chord_iterator::~Chord_iterator(){}
void
Music_iterator::do_print()const
{
p = new Chord_iterator( (Chord*) m);
else if (m->is_type_b( Voice::static_name()))
p = new Voice_iterator( (Voice*) m);
- else if (m->is_type_b( Request::static_name() ))
- p = new Request_iterator( (Request*) m );
if ( m->is_type_b( Music_list::static_name())) {
Music_list* ml = (Music_list*) m;
/* ***************** */
-void
-Request_iterator::do_print()const
-{
- mtor << req_l_->name() ;
-}
-
-Request_iterator::Request_iterator(Request const*c)
-{
- req_l_ = (Request*)c;
- last_b_ = false;
-}
-
-void
-Request_iterator::process_and_next(Moment m)
-{
- if ( first_b_ ) {
- bool gotcha = daddy_iter_l_->report_to_l()->try_request(req_l_);
- if (!gotcha)
- req_l_->warning("Junking request: " + String(req_l_->name()));
- first_b_ = false;
- }
-
- if ( m >= req_l_->duration() )
- last_b_ = true;
-}
-
-Moment
-Request_iterator::next_moment()const
-{
-
- Moment m(0);
- if (!first_b_)
- m = req_l_->duration();
- return m;
-}
-
-bool
-Request_iterator::ok()const
-{
- return (req_l_->duration() && !last_b_) || first_b_; // ugh
-}
-
-IMPLEMENT_STATIC_NAME(Request_iterator);
-IMPLEMENT_IS_TYPE_B1(Request_iterator, Music_iterator);
-
-/* ****************** */
Change_iterator::Change_iterator(Change_reg * ch)
{
/* ******************** */
IMPLEMENT_STATIC_NAME(Voice_element_iterator);
-IMPLEMENT_IS_TYPE_B1(Voice_element_iterator,Chord_iterator);
+IMPLEMENT_IS_TYPE_B1(Voice_element_iterator,Music_iterator);
void
Voice_element_iterator::construct_children()
{
get_req_translator_l();
- Chord_iterator::construct_children();
}
Voice_element_iterator::Voice_element_iterator(Voice_element*el_l)
- : Chord_iterator(el_l)
{
-
+ elt_l_ = el_l;
+ elt_duration_ = el_l->time_int().length();
+ last_b_ = false;
+}
+
+
+bool
+Voice_element_iterator::ok()const
+{
+ return (elt_duration_ && !last_b_) || first_b_;
+}
+
+
+
+Moment
+Voice_element_iterator::next_moment()const
+{
+ Moment m(0);
+ if (!first_b_)
+ m = elt_duration_;
+ return m;
+}
+
+void
+Voice_element_iterator::do_print() const
+{
+#ifndef NPRINT
+ mtor << "duration: " << elt_duration_;
+#endif
+}
+void
+Voice_element_iterator::process_and_next(Moment mom)
+{
+ if ( first_b_ ) {
+ for (PCursor<Music*> i(elt_l_->music_p_list_); i.ok(); i++) {
+ assert(i->is_type_b(Request::static_name()));
+ Request * req_l = (Request*)i.ptr();
+ bool gotcha = report_to_l()->try_request(req_l);
+ if (!gotcha)
+ req_l->warning("Junking request: " + String(req_l->name()));
+
+ }
+ first_b_ = false;
+ }
+
+ if ( mom >= elt_duration_ )
+ last_b_ = true;
}
}
/* *************** */
-IMPLEMENT_STATIC_NAME(Subtle_req);
-IMPLEMENT_IS_TYPE_B1(Subtle_req,Musical_req);
-
-void
-Subtle_req::do_print() const
-{
-#ifndef NPRINT
- mtor << " subtime " << subtime_;
-#endif
-}
-
IMPLEMENT_STATIC_NAME(Dynamic_req);
IMPLEMENT_IS_TYPE_B1(Dynamic_req,Musical_req);
void
Dynamic_req::do_print() const
{
- Subtle_req::do_print();
+ Musical_req::do_print();
}
IMPLEMENT_STATIC_NAME(Absolute_dynamic_req);
void
Absolute_dynamic_req::do_print() const
{
+#ifndef NPRINT
Dynamic_req::do_print();
- mtor << " loudness " <<loudness_;
+ mtor << " loudness " <<loudness_str(loudness_);
+#endif
}
String
rest_col_l()->add(h_l);
else
note_col_l()->add(h_l);
- }
- else if (nC == Stem::static_name()){
+
+ } else if (nC == Stem::static_name()){
stem_l_ = (Stem*)i.elem_l_->item();
}
+
+ if ( ncol_p_ || restcol_p_ ) {
+ if ( stem_l_ ) {
+ if (restcol_p_&& !restcol_p_->stem_l_)
+ restcol_p_->set (stem_l_ );
+ if (ncol_p_ && !ncol_p_->stem_l_)
+ ncol_p_->set(stem_l_);
+ }
+
+
+ for (int i=0; i < script_l_arr_.size(); i++) {
+ if (restcol_p_)
+ restcol_p_->add(script_l_arr_[i]);
+ if ( ncol_p_ )
+ ncol_p_->add(script_l_arr_[i]);
+ }
+
+ script_l_arr_.set_size(0);
+ }
+
}
void
Note_column_engraver::do_pre_move_processing()
{
- Script_column *col_l = ( ncol_p_ ) ? ncol_p_ : restcol_p_;
- if (!col_l)
- return;
-
- for (int i=0; i < script_l_arr_.size(); i++)
- col_l->add(script_l_arr_[i]);
-
- if (stem_l_) {
- if (ncol_p_)
- ncol_p_->add(stem_l_);
- if (restcol_p_)
- restcol_p_->add(stem_l_);
- }
- if (restcol_p_) {
- if (! restcol_p_ -> dir_i_)
- restcol_p_->dir_i_ = dir_i_;
- typeset_element(restcol_p_);
- restcol_p_ =0;
- }
if (ncol_p_) {
- if (! ncol_p_->dir_i_ )
- ncol_p_->dir_i_ = dir_i_;
if (! ncol_p_->h_shift_b_)
ncol_p_->h_shift_b_ = h_shift_b_;
+ if (! ncol_p_->dir_i_ )
+ ncol_p_->dir_i_ = dir_i_;
+
typeset_element(ncol_p_);
ncol_p_ =0;
}
+ if (restcol_p_) {
+ if (! restcol_p_->dir_i_ )
+ restcol_p_->dir_i_ = dir_i_;
+
+ typeset_element(restcol_p_);
+ restcol_p_ =0;
+ }
}
void
restcol_p_ =0;
do_post_move_processing();
}
+
IMPLEMENT_STATIC_NAME(Note_column_engraver);
IMPLEMENT_IS_TYPE_B1(Note_column_engraver,Engraver);
ADD_THIS_ENGRAVER(Note_column_engraver);
*/
#include "note-column.hh"
-#include "debug.hh"
#include "script.hh"
#include "note-head.hh"
#include "stem.hh"
IMPLEMENT_STATIC_NAME(Note_column);
-IMPLEMENT_IS_TYPE_B1(Note_column,Script_column);
+IMPLEMENT_IS_TYPE_B1(Note_column,Head_column);
void
-Note_column::add(Stem*stem_l)
+Note_column::set(Stem*s)
{
- stem_l_ = stem_l;
- add_support(stem_l);
-}
-
-void
-Note_column::add(Note_head* n_l)
-{
- assert(!n_l->rest_b_);
- head_l_arr_.push(n_l);
- add_support(n_l);
+ stem_l_ = s;
+ add_support(s);
}
Note_column::Note_column()
{
- stem_l_ = 0;
h_shift_b_ =false;
- dir_i_ =0;
}
void
Interval_t<int>
Note_column::head_positions_interval()const
{
- ( (Note_column*)this)->sort();
+ ((Note_column*)this)->sort();
return Interval_t<int> ( head_l_arr_[0]->position_i_,
head_l_arr_.top()->position_i_);
void
Note_column::do_pre_processing()
{
- if (!dir_i_){
- if (stem_l_)
- dir_i_ = stem_l_->dir_i_;
- else
- dir_i_ = (head_positions_interval().center() >= 5) ? -1 : 1;
+ if (!dir_i_&& !stem_l_){
+ dir_i_ = (head_positions_interval().center() >= 5) ? -1 : 1;
}
- Script_column::do_pre_processing();
+ Head_column::do_pre_processing();
}
-
-void
-Note_column::do_substitute_dependency(Score_elem*o,Score_elem*n)
-{
- Script_column::do_substitute_dependency(o,n);
- if (o->name() == Note_head::static_name()) {
- head_l_arr_.substitute( (Note_head*)o->item(),
- (n)? (Note_head*)n->item() : 0);
- }
- if (stem_l_ == o) {
- stem_l_ = n ? (Stem*)n->item():0;
- }
-}
if (breakable_b())
return;
- prebreak_p_ = new PCol(this);
- postbreak_p_ = new PCol(this);
+ do_set_breakable();
prebreak_p_->pscore_l_ = pscore_l_;
postbreak_p_->pscore_l_ = pscore_l_;
+
+ prebreak_p_->daddy_l_ = postbreak_p_->daddy_l_ = this;
+}
+void
+PCol::do_set_breakable()
+{
+ prebreak_p_ = new PCol;
+ postbreak_p_ = new PCol;
}
+
bool
PCol::breakpoint_b() const
return prebreak_p_||postbreak_p_;
}
-PCol::PCol(PCol *parent)
+PCol::PCol()
{
used_b_ = false;
error_mark_b_ = false;
- daddy_l_ = parent;
+ daddy_l_ = 0;
prebreak_p_=0;
postbreak_p_=0;
line_l_=0;
- hpos = -1.0;
+ hpos_f_ = -1.0;
pscore_l_ = 0;
rank_i_ = -1;
}
PCol::~PCol()
{
delete prebreak_p_;
- delete postbreak_p_;
+ delete postbreak_p_;
}
void
bool
PCol::used_b()const
{
- return breakable_b() || its.size()|| used_b_;
+ return daddy_l_ || breakable_b() || its.size()|| used_b_;
}
*/
#include "super-elem.hh"
-#include "idealspacing.hh"
#include "debug.hh"
#include "lookup.hh"
#include "spanner.hh"
#include "scoreline.hh"
#include "p-score.hh"
#include "tex-stream.hh"
-#include "break.hh"
+#include "word-wrap.hh"
#include "p-col.hh"
PScore::PScore(Paper_def*p)
void
PScore::typeset_unbroken_spanner(Spanner*span_p)
{
- spanners.bottom().add(span_p);
+ span_p_list_.bottom().add(span_p);
span_p->pscore_l_=this;
- if ( span_p->left_col_l_)
+ if (span_p->left_col_l_)
span_p->left_col_l_->used_b_ = true;
if ( span_p->right_col_l_)
span_p->right_col_l_->used_b_ = true;
span_p->add_processing();
}
-Idealspacing*
-PScore::get_spacing(PCol*l, PCol*r)
-{
- assert(l!=r);
-
- Idealspacing*i_p =new Idealspacing(l,r);
- suz.bottom().add(i_p);
-
- return i_p;
-}
-
void
PScore::clean_cols()
{
int rank_i = 0;
- for (iter_top(cols,c); c.ok(); )
+ for (iter_top(col_p_list_,c); c.ok(); )
if (!c->used_b()) {
delete c.remove_p();
} else {
}
}
-void
-PScore::do_connect(PCol *c1, PCol *c2, Real d, Real h)
-{
- if (!c1 || !c2 )
- return;
- Idealspacing*s_l=get_spacing(c1,c2);
-
-
- s_l->hooke = h;
- s_l->space =d;
-}
-
-void
-PScore::connect(PCol* c1, PCol *c2, Real d, Real h)
-{
- do_connect(c1,c2,d,h);
- do_connect(c1->postbreak_p_, c2,d,h);
- do_connect(c1, c2->prebreak_p_,d,h);
- do_connect(c1->postbreak_p_, c2->prebreak_p_,d,h);
-}
-
void
PScore::add(PCol *p)
{
p->prebreak_p_->pscore_l_ = this;
p->postbreak_p_->pscore_l_ = this;
}
- cols.bottom().add(p);
+ col_p_list_.bottom().add(p);
}
void
PScore::OK()const
{
#ifndef NDEBUG
- for (iter_top(cols,cc); cc.ok(); cc++)
+ for (iter_top(col_p_list_,cc); cc.ok(); cc++)
cc->OK();
- for (iter_top(suz,i); i.ok(); i++)
- i->OK();
#endif
}
for (iter_top(elem_p_list_,cc); cc.ok(); cc++)
cc->print();
mtor << "\n unbroken spanners: ";
- for (iter(spanners.top(), i); i.ok(); i++)
+ for (iter(span_p_list_.top(), i); i.ok(); i++)
i->print();
mtor << "\ncolumns: ";
- for (iter_top(cols,cc); cc.ok(); cc++)
+ for (iter_top(col_p_list_,cc); cc.ok(); cc++)
cc->print();
- mtor << "\nideals: ";
- for (iter_top(suz,i); i.ok(); i++)
- i->print();
mtor << "}\n";
#endif
}
if (what->daddy_l_ )
what = what->daddy_l_;
- return cols.find((PCol*)what);
+ return col_p_list_.find((PCol*)what);
}
super_elem_l_->break_processing();
- for (iter(spanners.top(),i); i.ok(); ) {
+ for (iter(span_p_list_.top(),i); i.ok(); ) {
Spanner *span_p = i.remove_p();
if (span_p->broken_b()) {
span_p->unlink();
i++;
}
- for (iter_top(cols, i); i.ok(); i++)
+ for (iter_top(col_p_list_, i); i.ok(); i++)
i->clean_breakable_items();
}
PScore::calc_breaking()
{
Word_wrap w(*this);
+
set_breaking(w.solve());
}
{
Link_array<PCol> ret;
- PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
- PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
+ PCursor<PCol*> start(l ? find_col(l)+1 : col_p_list_.top() );
+ PCursor<PCol*> stop(r ? find_col(r) : col_p_list_.bottom());
/*
ugh! windows-suck-suck-suck.
{
Link_array<PCol> ret;
- PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
- PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
+ PCursor<PCol*> start(l ? find_col(l)+1 : col_p_list_.top() );
+ PCursor<PCol*> stop(r ? find_col(r) : col_p_list_.bottom());
ret.push(l);
/*
{
Link_array<PCol> ret;
- PCursor<PCol*> start(l ? find_col(l)+1 : cols.top() );
- PCursor<PCol*> stop(r ? find_col(r) : cols.bottom());
+ PCursor<PCol*> start(l ? find_col(l)+1 : col_p_list_.top() );
+ PCursor<PCol*> stop(r ? find_col(r) : col_p_list_.bottom());
/*
ugh! windows-suck-suck-suck.
#include <iostream.h>
// mmm
-#define MUDELA_VERSION "0.0.61"
+#define MUDELA_VERSION "0.1.0"
#include "script-def.hh"
#include "symtable.hh"
%token <id> SCRIPT_IDENTIFIER
%token <id> STAFF_IDENTIFIER
%token <id> REAL_IDENTIFIER
+%token <id> INPUT_TRANS_IDENTIFIER
%token <id> INT_IDENTIFIER
%token <id> SCORE_IDENTIFIER
%token <id> MIDI_IDENTIFIER
old_identifier:
IDENTIFIER
+ | INPUT_TRANS_IDENTIFIER
| MELODIC_REQUEST_IDENTIFIER
| POST_REQUEST_IDENTIFIER
| SCRIPT_IDENTIFIER
$$ = new Request_id(*$1, $3, MELODIC_REQUEST_IDENTIFIER);
delete $1;
}
+ | declarable_identifier '=' input_translator_spec {
+ $$ = new Input_translator_id ( *$1, $3, INPUT_TRANS_IDENTIFIER);
+ delete $1;
+ }
;
;
input_translator_spec_body:
- STRING STRING {
+ INPUT_TRANS_IDENTIFIER {
+ $$ = $1->input_translator(true);
+ $$-> set_spot( THIS->here_input() );
+ }
+ | STRING STRING {
$$ = new Input_translator;
$$->base_str_ = *$1;
$$->type_str_ =*$2;
Rest_collision_engraver::do_print() const
{
#ifndef NPRINT
- mtor << "collisions: " << collision_l_arr_.size();
if ( rest_collision_p_ )
rest_collision_p_->print();
#endif
// meisjes met meisjes
if (!ncol_l_arr_.size()) {
int dy = rest_l_arr_.size() > 2 ? 6 : 4;
- rest_l_arr_[0]->translate_heads(dy);
+
+ rest_l_arr_[0]->translate_heads(rest_l_arr_[0]->dir_i_ *dy);
// top is last element...
- rest_l_arr_.top()->translate_heads(-dy);
+ rest_l_arr_.top()->translate_heads(rest_l_arr_.top()->dir_i_* dy);
}
// meisjes met jongetjes
else {
#include "stem.hh"
IMPLEMENT_STATIC_NAME(Rest_column);
-IMPLEMENT_IS_TYPE_B1(Rest_column,Item);
-
-Rest_column::Rest_column()
-{
- dir_i_ = 0;
- stem_l_ = 0;
-}
-
-void
-Rest_column::add(Note_head *n_l)
-{
- add_support(n_l);
- head_l_arr_.push(n_l);
-}
-
-void
-Rest_column::add(Stem*stem_l)
-{
- stem_l_ = stem_l;
- add_dependency(stem_l);
-// add_support(stem_l);
-}
-
-void
-Rest_column::do_print() const
-{
-#ifndef NPRINT
- mtor << "heads: " << head_l_arr_.size();
-#endif
-}
-
-void
-Rest_column::do_substitute_dependency(Score_elem*o,Score_elem*n)
-{
- Script_column::do_substitute_dependency(o,n);
- if (o == stem_l_)
- stem_l_ = n? (Stem*)n->item() :0;
-
- if (o->is_type_b( Note_head::static_name()) )
- head_l_arr_.substitute( (Note_head*)o->item(),
- (n)? (Note_head*)n->item() : 0);
-}
+IMPLEMENT_IS_TYPE_B1(Rest_column,Head_column);
/**
Score_align_engraver::acknowledge_element(Score_elem_info inf)
{
if (inf.elem_l_->is_type_b(type_ch_C_ )) {
-
- if (! align_p_ ) {
+
+ if (!align_p_ ) {
align_p_ = new Horizontal_group_item;
announce_element(Score_elem_info(align_p_,0));
}
align_p_->add_element(inf.elem_l_);
}
+
}
IMPLEMENT_STATIC_NAME(Score_align_engraver)
#include "p-col.hh"
#include "score-column.hh"
-int
-Score_column::compare(Score_column & c1, Score_column &c2)
-{
- return sign(c1.when_ - c2.when_);
-}
-
-void
-Score_column::set_breakable()
-{
- pcol_l_->set_breakable();
-}
-
Score_column::Score_column(Moment w)
{
when_ = w;
- pcol_l_ = new PCol(0);
musical_b_ = false;
}
-bool
-Score_column::used_b() {
- return pcol_l_->used_b();
-}
-
void
Score_column::print() const
{
for (int i=0; i < durations.size(); i++)
mtor << durations[i] << " ";
mtor << "]\n";
- pcol_l_->print();
+ PCol::print();
mtor << "}\n";
#endif
}
int
-Moment_compare(Moment &a , Moment& b)
+Moment_compare(Moment const &m1, Moment const &m2)
{
- return sign(a-b);
+ return sign(m1-m2);
}
void
{
durations.sort(Moment_compare);
}
+
void
Score_column::add_duration(Moment d)
{
durations.push(d);
}
-bool
-Score_column::breakable_b()
+void
+Score_column::do_set_breakable()
{
- return pcol_l_->breakable_b();
+ Score_column *c1 = new Score_column(when_);
+ Score_column *c2 = new Score_column(when_);
+ prebreak_p_ =c1;
+ postbreak_p_ = c2;
+ c1->durations = durations;
+ c2->durations = durations;
+ c1->musical_b_
+ = c2->musical_b_ = musical_b_;
}
String
Score_elem::TeX_string() const
{
- assert( status > POSTCALCED);
+ assert( status_ > POSTCALCED);
if (transparent_b_ )
return "";
String s( "\\placebox{%}{%}{%}");
copy_edges_out(s);
x_group_element_i_ = 0;
y_group_element_i_ = 0;
- status = s.status;
+ status_ = s.status_;
assert(!s.output);
output = 0;
pscore_l_ = s.pscore_l_;
Score_elem::~Score_elem()
{
// some paranoia to prevent weird segv's
- assert(status < DELETED);
+ assert(status_ < DELETED);
delete output;
- status = DELETED;
+ status_ = DELETED;
output = 0;
assert(!x_group_element_i_ && !y_group_element_i_);
}
pscore_l_=0;
offset_ = Offset(0,0);
output = 0;
- status = ORPHAN;
+ status_ = ORPHAN;
}
void
Score_elem::add_processing()
{
- if (status >= VIRGIN)
+ if (status_ >= VIRGIN)
return;
- status = VIRGIN;
+ status_ = VIRGIN;
do_add_processing();
}
void
Score_elem::pre_processing()
{
- if (status >= PRECALCED )
+ if (status_ >= PRECALCED )
return;
- assert(status != PRECALCING); // cyclic dependency
- status = PRECALCING;
+ assert(status_ != PRECALCING); // cyclic dependency
+ status_ = PRECALCING;
for (int i=0; i < dependency_size(); i++)
dependency(i)->pre_processing();
do_pre_processing();
- status = PRECALCED;
+ status_ = PRECALCED;
}
void
Score_elem::breakable_col_processing()
{
- if (status >= PREBROKEN )
+ if (status_ >= PREBROKEN )
return;
- assert(status != PREBREAKING); // cyclic dependency
- status = PREBREAKING;
+ assert(status_ != PREBREAKING); // cyclic dependency
+ status_ = PREBREAKING;
for (int i=0; i < dependency_size(); i++)
dependency(i)->breakable_col_processing();
do_breakable_col_processing();
- status = PREBROKEN;
+ status_ = PREBROKEN;
}
void
Score_elem::break_processing()
{
- if (status >= BROKEN )
+ if (status_ >= BROKEN )
return;
- assert(status != BREAKING); // cyclic dependency
- status = BREAKING;
+ assert(status_ != BREAKING); // cyclic dependency
+ status_ = BREAKING;
for (int i=0; i < dependency_size(); i++)
dependency(i)->break_processing();
do_break_processing();
- status = BROKEN;
+ status_ = BROKEN;
}
void
void
Score_elem::post_processing()
{
- if (status >= POSTCALCED)
+ if (status_ >= POSTCALCED)
return;
- assert(status != POSTCALCING);// cyclic dependency
- status=POSTCALCING;
+ assert(status_ != POSTCALCING);// cyclic dependency
+ status_=POSTCALCING;
for (int i=0; i < dependency_size(); i++)
dependency(i)->post_processing();
do_post_processing();
- status=POSTCALCED;
+ status_=POSTCALCED;
+}
+
+Score_elem::Status
+Score_elem::status()const
+{
+ return status_;
}
void
Score_elem::molecule_processing()
{
- if (status >= OUTPUT)
+ if (status_ >= OUTPUT)
return;
- status = OUTPUT; // do it only once.
+ status_ = OUTPUT; // do it only once.
for (int i=0; i < dependency_size(); i++)
dependency(i)->molecule_processing();
}
void
Score_elem::do_substitute_dependent(Score_elem*,Score_elem*)
-{}
+{
+}
IMPLEMENT_STATIC_NAME(Score_elem);
Score_elem::remove_dependency(Score_elem*e)
{
remove_edge_out(e);
- e->do_substitute_dependent(this, 0);
- do_substitute_dependency(e, 0);
+ substitute_dependency(e, 0);
}
void
{
Directed_graph_node::add(e);
}
-
+void
+Score_elem::substitute_dependency(Score_elem* old, Score_elem* new_l)
+{
+ do_substitute_dependency(old,new_l);
+ old->do_substitute_dependent(this, 0);
+}
void
Score_elem::handle_broken_dependencies()
if (elt->spanner()) {
Spanner * sp = elt->spanner();
Spanner * broken = sp->find_broken_piece(line);
- do_substitute_dependency(sp, broken);
+ substitute_dependency(sp, broken);
add_dependency(broken);
} else if (elt->item() && elt->item()->pcol_l_->breakpoint_b()
&& elt->item()->break_status_i() == 0) {
Item * my_item = elt->item()->find_prebroken_piece(line);
- do_substitute_dependency( elt, my_item);
+ substitute_dependency( elt, my_item);
if (my_item)
add_dependency( my_item);
}
/* Reset this. If we are a (broken) copy of a spanner, then
break_processing() was not called on us (and we are not breaking). */
- if (status < BROKEN)
- status = BROKEN;
+ if (status_ < BROKEN)
+ status_ = BROKEN;
}
/*
/*
see comment at handle_broken_dependencies()
*/
- if (status < PREBROKEN)
- status = PREBROKEN;
+ if (status_ < PREBROKEN)
+ status_ = PREBROKEN;
}
#include "score.hh"
#include "musical-request.hh"
#include "score-column.hh"
+#include "command-request.hh"
void
Score_engraver::Score_engraver()
{
+ disallow_break_b_ = false;
scoreline_l_ =0;
command_column_l_ =0;
musical_column_l_ =0;
+ breaks_i_ =0;
}
void
Score_engraver::prepare(Moment w)
{
- Score_column* c1 = new Score_column(w);
- Score_column* c2 = new Score_column(w);
+ command_column_l_ = new Score_column(w);
+ musical_column_l_ = new Score_column(w);
- c1->musical_b_ = false;
- c2->musical_b_ = true;
+ command_column_l_->musical_b_ = false;
+ musical_column_l_->musical_b_ = true;
- score_l_->cols_.bottom().add(c1);
- score_l_->cols_.bottom().add(c2);
- set_cols(c1,c2);
-
-
+ score_l_->pscore_p_->add(command_column_l_);
+ score_l_->pscore_p_->add(musical_column_l_);
+ disallow_break_b_ = false;
post_move_processing();
}
+
void
Score_engraver::finish()
{
Engraver_group_engraver::do_creation_processing();
}
-void
-Score_engraver::set_cols(Score_column*c1,Score_column*c2)
-{
- command_column_l_ = c1;
- musical_column_l_ = c2;
-}
-
void
Score_engraver::do_removal_processing()
{
void
Score_engraver::announce_element(Score_elem_info info)
{
+ announce_info_arr_.push(info);
info.origin_grav_l_arr_.push(this);
- if (info.elem_l_->name() == Bar::static_name()) {
- get_staff_info().command_pcol_l()->set_breakable();
- }
- announce_info_arr_.push(info);
}
void
Score_engraver::do_announces()
*/
if (announce_info_arr_[i].req_l_) {
Musical_req *m = announce_info_arr_[i].req_l_->musical();
- if (m&&m->rhythmic()) {
+ if (m && m->rhythmic()) {
musical_column_l_->add_duration( m->duration());
}
}
void
Score_engraver::do_pre_move_processing()
{
+ if ( !disallow_break_b_ ){
+ get_staff_info().command_pcol_l()->set_breakable();
+ breaks_i_ ++;
+ if ( ! (breaks_i_%8))
+ *mlog << "[" << breaks_i_ << "]" << flush;
+ }
// this generates all items.
Engraver_group_engraver::do_pre_move_processing();
for ( int i =0; !gotcha && i < nongroup_l_arr_.size() ; i++)
gotcha = nongroup_l_arr_[i]->try_request(r);
+ if ( r->command() && r->command()->disallowbreak())
+ disallow_break_b_ = true;
return gotcha;
}
}
trans_l->modify_next( w );
trans_l->prepare(w);
+ trans_l->print();
+
iter->process_and_next( w );
trans_l->process();
}
if ( !midi_p_ )
return;
- *mlog << "\nCreating elements ..." << flush;
+ *mlog << "\nCreating MIDI elements ..." << flush;
Global_translator* score_trans= midi_p_->get_global_translator_p();
run_translator( score_trans );
warning("Errors found, /*not processing score*/");
// return;
}
- do_cols();
- clean_cols(); // can't move clean_cols() farther up.
print();
- calc_idealspacing();
// debugging
- OK();
*mlog << endl;
pscore_p_->process();
paper_output();
}
-/**
- Remove empty cols, preprocess other columns.
- */
-void
-Score::clean_cols()
-{
- for (iter_top(cols_,c); c.ok(); ) {
- if (!c->pcol_l_->used_b()) {
- delete c.remove_p();
- } else {
- c->preprocess();
- c++;
- }
- }
-}
-
-PCursor<Score_column*>
-Score::find_col(Moment w, bool mus)
-{
- iter_top( cols_,i);
-
- for (; i.ok(); i++) {
- if (i->when() == w && i->musical_b_ == mus)
- return i;
- if (i->when() > w)
- break;
- }
- assert(false);
- return i;
-}
-
-void
-Score::do_cols()
-{
- iter_top(cols_,i);
- for (; i.ok(); i++) {
- pscore_p_->add(i->pcol_l_);
- }
-}
void
Score::set(Paper_def *pap_p)
midi_p_ = midi_p;
}
-void
-Score::OK() const
-{
-#ifndef NDEBUG
- cols_.OK();
- for (iter_top(cols_,cc); cc.ok() && (cc+1).ok(); cc++) {
- assert(cc->when() <= (cc+1)->when());
- }
-#endif
-}
void
#ifndef NPRINT
mtor << "score {\n";
music_p_->print();
- for (iter_top(cols_,i); i.ok(); i++) {
- i->print();
- }
- if (pscore_p_)
- pscore_p_->print();
if (midi_p_)
midi_p_->print();
s+= "\\scorelineerrormark";
- Real lastpos = cols[0]->hpos;
+ Real lastpos = cols[0]->hpos_f_;
for (int i=0; i < cols.size(); i++){
PCol* col_l= cols[i];
// all items in the current line & staff.
String chunk_str;
- Real delta = col_l->hpos - lastpos;
+ Real delta = col_l->hpos_f_ - lastpos;
if (col_l->error_mark_b_) {
if (delta)
s +=String( "\\kern ") + print_dimen(delta);
s += chunk_str;
- lastpos = col_l->hpos;
+ lastpos = col_l->hpos_f_;
}
}
s += "}";
void
Line_of_score::add(Score_elem*e)
{
- add_dependency(e);
+ if( !e->dependent_size()) // avoid excess dependencies.
+ add_dependency(e);
}
bool
}
for (int i=0; i < curline.size(); i++){
- curline[i]->hpos = config[i];
+ curline[i]->hpos_f_ = config[i];
curline[i]->line_l_ = (Line_of_score*)line_l;
}
}
void
Script_column::do_print()const
{
+#ifndef NPRINT
mtor << "scripts: " << script_l_arr_.size() << '\n';
+#endif
}
+
static int
idx(bool inside, int dir)
{
+++ /dev/null
-/*
- silent-performer.cc -- implement Silent_performer
-
- (c) 1996, 1997 Jan Nieuwenhuizen <jan@digicash.com>
- */
-
-#include "silent-performer.hh"
-#include "translator.hh"
-#include "input-translator.hh"
-#include "command-request.hh"
-#include "musical-request.hh"
-#include "debug.hh"
-
-IMPLEMENT_IS_TYPE_B1(Silent_performer,Performer);
-IMPLEMENT_STATIC_NAME(Silent_performer);
-ADD_THIS_PERFORMER(Silent_performer);
-
-Silent_performer::Silent_performer()
-{
-}
-
-Silent_performer::~Silent_performer()
-{
-}
-
-bool
-Silent_performer::try_request( Request* req_l )
-{
- return true;
-#if 0
- Command_req* com_l = req_l->command();
- Musical_req* mus_l = req_l->musical();
-
- if ( com_l ) {
- if ( com_l->bar() )
- return true;
-
- if ( com_l->barcheck() )
- return true;
- }
-
- if ( mus_l ) {
- if ( mus_l->beam() )
- return true;
-
- if( mus_l->rest() )
- return true;
-
- if( mus_l->slur() )
- return true;
-
- if ( mus_l->stem() )
- return true;
-
- if ( mus_l->tie() )
- return true;
- }
-
- return false;
-#endif
-}
-
valign_l_ =0;
}
+Span_bar*
+Span_bar_engraver::get_span_bar_p()const
+{
+ return new Span_bar;
+}
+
void
Span_bar_engraver::acknowledge_element(Score_elem_info i)
{
- if ( i.elem_l_->is_type_b( Bar::static_name() ) ) {
+ if ( i.origin_grav_l_arr_.size() > 1 &&
+ i.elem_l_->is_type_b( Bar::static_name() ) ) {
bar_l_arr_.push( (Bar*)i.elem_l_->item() );
if (bar_l_arr_.size() >= 2 && !spanbar_p_) {
- spanbar_p_ = new Span_bar;
+ spanbar_p_ = get_span_bar_p();
announce_element( Score_elem_info(spanbar_p_,0) );
}
} else if (i.elem_l_->is_type_b( Vertical_align_spanner::static_name() )
(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
-
+#include "dimen.hh"
#include "span-bar.hh"
#include "lookup.hh"
#include "symbol.hh"
}
spanning_l_arr_.substitute( bold , b);
+}
+/*
+ A no-op if not yet output: the span_bar slavish follows what it spans
+ */
+void
+Span_bar::translate_y(Real y)
+{
+ if (status() == OUTPUT)
+ Score_elem::translate_y(y);
}
void
}
+Interval
+Span_bar::do_width() const
+{
+ return paper()->lookup_l()->bar(type_str_, 40 PT).dim.x; // ugh
+}
void
Span_bar::do_pre_processing()
{
transparent_b_ = true;
empty_b_ =true;
} else {
- type_str_ = spanning_l_arr_[0]->type_str_;
+ if (type_str_ == "")
+ type_str_ = spanning_l_arr_[0]->type_str_;
if (type_str_ =="") {
transparent_b_=true;
empty_b_ = true;
}
}
+Symbol
+Span_bar::get_bar_sym(Real dy) const
+{
+ return paper()->lookup_l()->bar(type_str_, dy);
+}
+
Molecule*
Span_bar::brew_molecule_p()const
{
Interval y;
for (int i=0; i < spanning_l_arr_.size(); i++)
y.unite( spanning_l_arr_[i]->height() );
- Symbol s = paper()->lookup_l()->bar(type_str_, y.length());
+ Symbol s = get_bar_sym(y.length());
Molecule*output = new Molecule(Atom(s));
output->translate_y ( y[-1] );
+++ /dev/null
-/*
- span-brace-engraver.cc -- implement Span_brace_engraver
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
-*/
-
-#include "span-brace-item.hh"
-#include "span-brace-engraver.hh"
-#include "vertical-align-spanner.hh"
-
-IMPLEMENT_STATIC_NAME(Span_brace_engraver);
-IMPLEMENT_IS_TYPE_B1(Span_brace_engraver,Engraver);
-ADD_THIS_ENGRAVER(Span_brace_engraver);
-
-Span_brace_engraver::Span_brace_engraver()
-{
- span_brace_p_ = 0;
- valign_l_ = 0;
-}
-
-Span_brace_engraver::~Span_brace_engraver()
-{
-}
-
-void
-Span_brace_engraver::acknowledge_element( Score_elem_info i )
-{
- if ( i.elem_l_->is_type_b( Bar::static_name() ) ) {
- bar_l_arr_.push( (Bar*)i.elem_l_->item() );
-
- if ( bar_l_arr_.size() >= 2 && !span_brace_p_ ) {
- span_brace_p_ = new Span_brace_item;
- announce_element( Score_elem_info( span_brace_p_, 0 ) );
- }
- }
- else if ( i.elem_l_->is_type_b( Vertical_align_spanner::static_name() )
- && i.origin_grav_l_arr_.size() <= 2 )
- valign_l_ = (Vertical_align_spanner*)i.elem_l_->spanner();
-}
-
-void
-Span_brace_engraver::do_pre_move_processing()
-{
- if ( span_brace_p_ ) {
- for ( int i=0; i < bar_l_arr_.size() ; i++ )
- span_brace_p_->add( bar_l_arr_[ i ] );
- span_brace_p_->set( valign_l_ );
- typeset_breakable_item( span_brace_p_ );
- span_brace_p_ = 0;
- }
-
- bar_l_arr_.clear();
-}
-
+++ /dev/null
-/*
- span-brace-item.cc -- implement Span_brace_item
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
- Jan Nieuwenhuizen <jan@digicash.com>
-*/
-
-#include "span-brace-item.hh"
-#include "lookup.hh"
-#include "symbol.hh"
-#include "paper-def.hh"
-#include "molecule.hh"
-#include "vertical-align-elem.hh"
-
-IMPLEMENT_STATIC_NAME(Span_brace_item);
-IMPLEMENT_IS_TYPE_B1( Span_brace_item, Item );
-
-void
-Span_brace_item::add( Bar* b )
-{
- b->spanned_i_++;
- spanning_l_arr_.push( b );
- add_dependency( b );
-}
-
-void
-Span_brace_item::do_substitute_dependency( Score_elem* o, Score_elem* n )
-{
- Bar* bold = 0;
- if ( o->is_type_b( Bar::static_name() ) )
- bold = (Bar*)o->item();
- else
- return;
-
- bold->spanned_i_--;
- Bar* b = 0;
- if ( n && n->is_type_b( Bar::static_name() ) ) {
- b = (Bar*)n->item();
- b->spanned_i_++;
- }
-
- spanning_l_arr_.substitute( bold, b );
-}
-
-void
-Span_brace_item::set( Vertical_align_element* a )
-{
- add_dependency( a );
-}
-
-
-void
-Span_brace_item::do_pre_processing()
-{
- if ( spanning_l_arr_.size () < 1 ) {
- transparent_b_ = true;
- empty_b_ = true;
- }
- else { // 0: nobreak, 1: pre, 2: post
- empty_b_ = ( break_status_i() != 2 );
- transparent_b_ = ( break_status_i() != 1 );
- }
-}
-
-Molecule*
-Span_brace_item::brew_molecule_p() const
-{
- Interval y;
- for ( int i = 0; i < spanning_l_arr_.size(); i++ )
- y.unite( spanning_l_arr_[ i ]->height() );
- // ugh, one extra staff @ 16pt
-// Real length_f = y.length() + spanning_l_arr_[ 0 ]->height().length();
-// Real length_f = y.length() + 16;
- Real length_f = y.length() - 6;
- Symbol s = paper()->lookup_l()->vbrace( length_f );
- Molecule* mol_p = new Molecule( Atom ( s ) );
-// mol_p->translate_y( - ( length_f + 16 ) / 2 );
- // urgh, what's wrong here?
- mol_p->translate_y( - length_f / 2 - 6 );
-
- return mol_p;
-}
-
--- /dev/null
+/*
+ span-score-bar-grav.cc -- implement Span_score_bar_engraver and Piano_bar_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+#include "span-score-bar.hh"
+#include "span-score-bar-grav.hh"
+
+
+Span_bar*
+Span_score_bar_engraver::get_span_bar_p() const
+{
+ return new Span_score_bar;
+}
+
+IMPLEMENT_STATIC_NAME(Span_score_bar_engraver);
+IMPLEMENT_IS_TYPE_B1(Span_score_bar_engraver, Span_bar_engraver);
+IMPLEMENT_STATIC_NAME(Piano_bar_engraver);
+IMPLEMENT_IS_TYPE_B1(Piano_bar_engraver, Span_score_bar_engraver);
+
+Span_bar*
+Piano_bar_engraver::get_span_bar_p() const
+{
+ return new Piano_brace;
+}
+
+ADD_THIS_ENGRAVER(Piano_bar_engraver);
+ADD_THIS_ENGRAVER(Span_score_bar_engraver);
--- /dev/null
+/*
+ span-score-bar.cc -- implement Span_score_bar
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "span-score-bar.hh"
+#include "symbol.hh"
+#include "paper-def.hh"
+#include "lookup.hh"
+
+Span_score_bar::Span_score_bar()
+{
+ type_str_ = "|";
+}
+
+void
+Span_score_bar::do_pre_processing()
+{
+ Span_bar::do_pre_processing();
+
+ if ( break_status_i() != 1) {
+ empty_b_ = transparent_b_ = true;
+ }
+}
+
+
+Symbol
+Piano_brace::get_bar_sym(Real dy)const
+{
+ return paper()->lookup_l()->vbrace(dy);
+}
+Interval
+Piano_brace::do_width()const
+{
+ return Interval(0,0);
+}
+
+IMPLEMENT_STATIC_NAME(Span_score_bar);
+IMPLEMENT_IS_TYPE_B1(Span_score_bar, Span_bar);
+IMPLEMENT_IS_TYPE_B1(Piano_brace, Span_score_bar);
+IMPLEMENT_STATIC_NAME(Piano_brace);
+
Interval
Spanner::do_width()const
{
- Real r = right_col_l_->hpos;
- Real l = left_col_l_->hpos;
+ Real r = right_col_l_->hpos_f_;
+ Real l = left_col_l_->hpos_f_;
assert(*left_col_l_ < *right_col_l_);
assert(r>=l);
--- /dev/null
+/*
+ spring-spacer.cc -- implement Spring_spacer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#include <math.h>
+#include "spring-spacer.hh"
+#include "p-col.hh"
+#include "debug.hh"
+#include "qlp.hh"
+#include "unionfind.hh"
+#include "idealspacing.hh"
+#include "pointer.tcc"
+#include "score-column.hh"
+#include "paper-def.hh"
+#include "dimen.hh"
+#include "minterval.hh"
+
+Vector
+Spring_spacer::default_solution()const
+{
+ return try_initial_solution() ;
+}
+
+Score_column*
+Spring_spacer::scol_l(int i)
+{
+ return (Score_column*)cols[i].pcol_l_;
+}
+
+const Real COLFUDGE=1e-3;
+template class P<Real>; // ugh.
+
+bool
+Spring_spacer::contains(PCol const *w)
+{
+ for (int i=0; i< cols.size(); i++)
+ if (cols[i].pcol_l_ == w)
+ return true;
+ return false;
+}
+
+
+void
+Spring_spacer::OK() const
+{
+#ifndef NDEBUG
+ for (int i = 1; i < cols.size(); i++)
+ assert(cols[i].rank_i_ > cols[i-1].rank_i_);
+ for (int i = 1; i < loose_col_arr_.size(); i++)
+ assert(loose_col_arr_[i].rank_i_ > loose_col_arr_[i-1].rank_i_);
+#endif
+}
+
+/**
+ Make sure no unconnected columns happen.
+ */
+void
+Spring_spacer::handle_loose_cols()
+{
+ Union_find connected(cols.size());
+ Array<int> fixed;
+ for (PCursor<Idealspacing*> i(ideal_p_list_.top()); i.ok(); i++){
+ connected.connect(i->left_i_,i->right_i_);
+ }
+ for (int i = 0; i < cols.size(); i++)
+ if (cols[i].fixed())
+ fixed.push(i);
+ for (int i=1; i < fixed.size(); i++)
+ connected.connect(fixed[i-1], fixed[i]);
+
+ for (int i = cols.size(); i--; ) {
+ if (! connected.equiv(fixed[0], i)) {
+ warning("unconnected column: " + String(i));
+ loosen_column(i);
+ }
+ }
+ OK();
+}
+
+
+/**
+ Guess a stupid position for loose columns. Put loose columns at
+ regular distances from enclosing calced columns
+ */
+void
+Spring_spacer::position_loose_cols(Vector &sol_vec)const
+{
+ if (!loose_col_arr_.size())
+ return ;
+ assert(sol_vec.dim());
+ Array<bool> fix_b_arr;
+ fix_b_arr.set_size(cols.size() + loose_col_arr_.size());
+ Real utter_right_f=-INFTY;
+ Real utter_left_f =INFTY;
+ for (int i=0; i < loose_col_arr_.size(); i++) {
+ fix_b_arr[loose_col_arr_[i].rank_i_] = false;
+ }
+ for (int i=0; i < cols.size(); i++) {
+ int r= cols[i].rank_i_;
+ fix_b_arr[r] = true;
+ utter_right_f = utter_right_f >? sol_vec(i);
+ utter_left_f = utter_left_f <? sol_vec(i);
+ }
+ Vector v(fix_b_arr.size());
+ int j =0;
+ int k =0;
+ for (int i=0; i < v.dim(); i++) {
+ if (fix_b_arr[i]) {
+ assert(cols[j].rank_i_ == i);
+ v(i) = sol_vec(j++);
+ } else {
+ Real left_pos_f =
+ (j>0) ?sol_vec(j-1) : utter_left_f;
+ Real right_pos_f =
+ (j < sol_vec.dim()) ? sol_vec(j) : utter_right_f;
+ int left_rank = (j>0) ? cols[j-1].rank_i_ : 0;
+ int right_rank = (j<sol_vec.dim()) ? cols[j].rank_i_ : sol_vec.dim();
+
+ int d_r = right_rank - left_rank;
+ Colinfo loose=loose_col_arr_[k++];
+ int r = loose.rank_i_ ;
+ assert(r > left_rank && r < right_rank);
+
+ v(i) = (r - left_rank)*left_pos_f/ d_r +
+ (right_rank - r) *right_pos_f /d_r;
+ }
+ }
+ sol_vec = v;
+}
+
+bool
+Spring_spacer::check_constraints(Vector v) const
+{
+ int dim=v.dim();
+ assert(dim == cols.size());
+
+ for (int i=0; i < dim; i++) {
+
+ if (cols[i].fixed()&&
+ abs(cols[i].fixed_position() - v(i)) > COLFUDGE)
+ return false;
+
+ if (!i)
+ continue;
+
+ Real mindist=cols[i-1].minright()
+ +cols[i].minleft();
+
+ // ugh... compares
+ Real dif =v(i) - v(i-1)- mindist;
+ bool b = (dif > - COLFUDGE);
+
+
+ if (!b)
+ return false;
+
+ }
+ return true;
+}
+
+bool
+Spring_spacer::check_feasible() const
+{
+ Vector sol(try_initial_solution());
+ return check_constraints(sol);
+}
+
+/// generate a solution which obeys the min distances and fixed positions
+Vector
+Spring_spacer::try_initial_solution() const
+{
+ int dim=cols.size();
+ Vector initsol(dim);
+ for (int i=0; i < dim; i++) {
+ if (cols[i].fixed()) {
+ initsol(i)=cols[i].fixed_position();
+
+ if (i > 0) {
+ Real r =initsol(i-1) + cols[i-1].minright();
+ if (initsol(i) < r ) {
+ warning("overriding fixed position");
+ initsol(i) =r;
+ }
+ }
+
+ } else {
+ Real mindist=cols[i-1].minright()
+ +cols[i].minleft();
+ if (mindist < 0.0)
+ warning("Excentric column");
+ initsol(i)=initsol(i-1)+mindist;
+ }
+ }
+
+ return initsol;
+}
+
+
+
+Vector
+Spring_spacer::find_initial_solution() const
+{
+ Vector v(try_initial_solution());
+ assert(check_constraints(v));
+ return v;
+}
+
+// generate the matrices
+void
+Spring_spacer::make_matrices(Matrix &quad, Vector &lin, Real &c) const
+{
+ quad.fill(0);
+ lin.fill(0);
+ c = 0;
+
+ for (PCursor<Idealspacing*> i(ideal_p_list_.top()); i.ok(); i++) {
+ int l = i->left_i_;
+ int r = i->right_i_;
+
+ quad(r,r) += i->hooke_f_;
+ quad(r,l) -= i->hooke_f_;
+ quad(l,r) -= i->hooke_f_;
+ quad(l,l) += i->hooke_f_;
+
+ lin(r) -= i->space_f_*i->hooke_f_;
+ lin(l) += i->space_f_*i->hooke_f_;
+
+ c += sqr(i->space_f_);
+ }
+}
+
+// put the constraints into the LP problem
+void
+Spring_spacer::make_constraints(Mixed_qp& lp) const
+{
+ int dim=cols.size();
+ for (int j=0; j < dim; j++) {
+ Colinfo c=cols[j];
+ if (c.fixed()) {
+ lp.add_fixed_var(j,c.fixed_position());
+ }
+ if (j > 0){
+ Vector c1(dim);
+
+ c1(j)=1.0 ;
+ c1(j-1)=-1.0 ;
+ lp.add_inequality_cons(c1, cols[j-1].minright() +
+ cols[j].minleft());
+ }
+ }
+}
+
+Array<Real>
+Spring_spacer::solve() const
+{
+ assert(check_feasible());
+
+ Mixed_qp lp(cols.size());
+ make_matrices(lp.quad,lp.lin, lp.const_term);
+ make_constraints(lp);
+ Vector start=find_initial_solution();
+ Vector sol(lp.solve(start));
+ if (!check_constraints(sol)) {
+ WARN << "solution doesn't satisfy constraints.\n" ;
+ }
+ Real energy_f =lp.eval(sol);
+ position_loose_cols(sol);
+
+ Array<Real> posns(sol);
+
+ posns.push(energy_f);
+ return posns;
+}
+
+/**
+ add one column to the problem.
+*/
+void
+Spring_spacer::add_column(PCol *col, bool fixed, Real fixpos)
+{
+ Colinfo c(col,(fixed)? &fixpos : 0);
+ if (cols.size())
+ c.rank_i_ = cols.top().rank_i_+1;
+ else
+ c.rank_i_ = 0;
+ cols.push(c);
+}
+
+Array<PCol*>
+Spring_spacer::error_pcol_l_arr()const
+{
+ Array<PCol*> retval;
+ for (int i=0; i< cols.size(); i++)
+ if (cols[i].ugh_b_)
+ retval.push(cols[i].pcol_l_);
+ for (int i=0; i < loose_col_arr_.size(); i++) {
+ retval.push(loose_col_arr_[i].pcol_l_);
+ }
+ return retval;
+}
+
+void
+Spring_spacer::loosen_column(int i)
+{
+ Colinfo c=cols.get(i);
+ for (PCursor<Idealspacing*> j(ideal_p_list_.top()); j.ok(); j++){
+ if (j->left_i_ == i|| j->right_i_ == i)
+ j.del();
+ else
+ j++;
+ }
+ c.ugh_b_ = true;
+
+ int j=0;
+ for (; j < loose_col_arr_.size(); j++) {
+ if (loose_col_arr_[j].rank_i_ > c.rank_i_)
+ break;
+ }
+ loose_col_arr_.insert(c,j);
+}
+
+
+void
+Spring_spacer::print() const
+{
+#ifndef NPRINT
+ for (int i=0; i < cols.size(); i++) {
+ mtor << "col " << i<<' ';
+ cols[i].print();
+ }
+ for (PCursor<Idealspacing*> i(ideal_p_list_.top()); i.ok(); i++){
+ i->print();
+ }
+#endif
+
+}
+
+
+void
+Spring_spacer::connect(int i, int j, Real d, Real h)
+{
+ Idealspacing * s = new Idealspacing;
+ s->left_i_ = i;
+ s->right_i_ = j;
+ s->space_f_ = d;
+ s->hooke_f_ = h;
+
+ ideal_p_list_.bottom().add(s);
+}
+
+/**
+ walk through all durations in all Score_columns
+ */
+struct Durations_iter
+{
+ Spring_spacer * sp_l_;
+ int col_i_;
+ int d_i_;
+
+ Durations_iter(Spring_spacer*);
+
+ Moment duration()const;
+ Moment when()const;
+
+ bool ok()const;
+ void next();
+};
+
+Durations_iter::Durations_iter(Spring_spacer * s)
+{
+ col_i_ =0;
+ d_i_ =0; // ugh
+
+ sp_l_ = s;
+ if (! sp_l_->scol_l(col_i_)->durations.size() )
+ next();
+}
+
+Moment
+Durations_iter::duration() const
+{
+ return sp_l_->scol_l(col_i_)->durations[d_i_];
+}
+
+bool
+Durations_iter::ok()const{
+ return col_i_ < sp_l_->cols.size();
+}
+
+Moment
+Durations_iter::when()const{
+ return sp_l_->scol_l(col_i_)->when();
+}
+
+void
+Durations_iter::next()
+{
+ d_i_ ++;
+ while ( col_i_ < sp_l_->cols.size()
+ && d_i_ >= sp_l_->scol_l(col_i_)->durations.size()){
+ col_i_ ++;
+ d_i_ =0;
+ }
+}
+
+
+/**
+ generate springs between columns.
+
+ UNDER DESTRUCTION
+
+ TODO: This needs rethinking. Spacing should take optical
+ effects into account, and should be local (measure wide)
+
+ The algorithm is taken from :
+
+ John S. Gourlay. ``Spacing a Line of Music,'' Technical Report
+ OSU-CISRC-10/87-TR35, Department of Computer and Information
+ Science, The Ohio State University, 1987.
+
+ */
+void
+Spring_spacer::calc_idealspacing()
+{
+
+ for (int i=0; i < cols.size(); i++)
+ scol_l(i)->preprocess();
+
+ /* get the shortest running note at a time. */
+ Array<Moment> shortest_arr_;
+ {
+ Durations_iter d_iter(this);
+ for (int i=0; i < cols.size(); i++) {
+ Moment now = scol_l(i)->when();
+ while ( d_iter.ok() && now >= d_iter.when() ) {
+ if ( now < d_iter.when() + d_iter.duration())
+ break;
+ d_iter.next();
+ }
+ if ( d_iter.ok() && now >= d_iter.when()) {
+ Durations_iter d2 = d_iter;
+ Moment shortest = INFTY;
+ while (d2.ok() && d2.when() <= now) {
+ shortest = shortest <? d2.duration();
+ d2.next();
+ }
+ shortest_arr_.push( shortest );
+ } else
+ shortest_arr_.push(0);
+ }
+
+ }
+#ifndef NPRINT
+ mtor << "shortest:[ ";
+ for (int i=0; i < shortest_arr_.size(); i++)
+ mtor << shortest_arr_[i] << " ";
+ mtor << "]\n";
+#endif
+
+ Array<Real> ideal_arr_;
+ Array<Real> hooke_arr_;
+ for (int i=0; i < cols.size(); i++){
+ ideal_arr_.push( -1.0);
+ hooke_arr_.push(1.0);
+ }
+
+ for (int i=0; i < cols.size(); i++) {
+ if ( !scol_l(i)->musical_b()) {
+ ideal_arr_[i] = cols[i].minright() + 2 PT;
+ hooke_arr_[i] = 2.0;
+ if (i+1 < cols.size()) {
+ Moment delta_t = scol_l(i+1)->when() - scol_l(i)->when() ;
+ Real dist = delta_t ? paper_l()->duration_to_dist(delta_t) : 0;
+ if (delta_t && dist > ideal_arr_[i])
+ ideal_arr_[i] = dist;
+ }
+ }
+ }
+ for (int i=0; i < cols.size(); i++) {
+ if (scol_l(i)->musical_b()) {
+ Moment shortest_len = shortest_arr_[i];
+ if ( ! shortest_len ) {
+ warning( "Can't find a ruling note at "
+ +String( scol_l(i)->when()));
+ shortest_len = 1;
+ }
+ Moment delta_t = scol_l(i+1)->when() - scol_l(i)->when();
+ Real dist = paper_l()->duration_to_dist(shortest_len);
+ dist *= delta_t / shortest_len;
+ if (!scol_l(i+1)->musical_b() ) {
+
+ if (ideal_arr_[i+1] + cols[i+1].minleft() < dist) {
+ ideal_arr_[i+1] = dist/2 + cols[i+1].minleft();
+ hooke_arr_[i+1] =1.0;
+ }
+ ideal_arr_[i] = dist/2;
+ } else
+ ideal_arr_[i] = dist;
+ }
+ }
+
+ for (int i=0; i < ideal_arr_.size()-1; i++) {
+ assert (ideal_arr_[i] >=0 && hooke_arr_[i] >=0);
+ connect(i, i+1, ideal_arr_[i], hooke_arr_[i]);
+ }
+
+}
+
+
+
+void
+Spring_spacer::prepare()
+{
+ calc_idealspacing();
+ handle_loose_cols();
+ print();
+}
+
+Line_spacer*
+Spring_spacer::constructor()
+{
+ return new Spring_spacer;
+}
+
+#if 0
+void obsolete()
+{
+ for (int i=0; i < cols.size(); i++) {
+ if (!scol_l(i)->used_b())
+ continue;
+
+
+ int j = i+1;
+
+ if (scol_l(i)->musical_b()) {
+ assert ( j < cols.size());
+
+ for (int n=0; n < scol_l(i)->durations.size(); n++) {
+ Moment d = scol_l(i)->durations[n];
+ Real dist = paper_l()->duration_to_dist(d);
+ Real strength = scol_l(i)->durations[0]/scol_l(i)->durations[n];
+ assert(strength <= 1.0);
+
+ while (j < cols.size()) {
+ if (scol_l(j)->used_b()
+ && scol_l(j)->when() >= d + scol_l(i)->when() )
+ break;
+ j++;
+ }
+ if ( j < cols.size() ){
+ Moment delta_desired = scol_l(j)->when() - (d+scol_l(i)->when());
+ dist += paper_l()->duration_to_dist(delta_desired);
+ if (scol_l(j)->musical_b()) {
+ dist += cols[j].minleft() + 2 PT;
+ }
+ connect(i, j, dist, strength);
+ }
+ }
+ } else if (j < cols.size()) {
+ while (!scol_l(j)->used_b())
+ j++;
+
+ /* attach i to the next column in use. This exists, since
+ the last col is breakable, and therefore in use
+ */
+
+ Moment d = scol_l(j)->when() - scol_l(i)->when();
+ Real minimal_f = cols[i].minright() +cols[j].minleft() + 2 PT;
+ Real durdist_f = (d) ? paper_l()->duration_to_dist(d) : 0; // todo
+
+ connect(i, j, minimal_f <? durdist_f, (d) ? 1.0:1.0);
+ }
+ // !j.ok() might hold if we're at the last col.
+ }
+}
+#endif
/*
- staff-gravs.cc -- implement Staff_engravers
+ staff-gravs.cc -- implement Line_group_engraver
source file of the GNU LilyPond music typesetter
#include "staffline.hh"
-Staff_engravers::Staff_engravers()
+Line_group_engraver::Line_group_engraver()
{
staffline_p_ =0;
}
void
-Staff_engravers::typeset_element(Score_elem *elem_p)
+Line_group_engraver::acknowledge_element(Score_elem_info elem)
{
- staff_elem_l_arr_.push(elem_p);
- Engraver_group_engraver::typeset_element(elem_p);
+ staffline_p_->add_element(elem.elem_l_);
}
-void
-Staff_engravers::typeset_breakable_item( Item * nobreak_p)
-{
- staff_elem_l_arr_.push(nobreak_p);
- Engraver_group_engraver::typeset_breakable_item(nobreak_p);
-}
-
-void
-Staff_engravers::do_pre_move_processing()
-{
- Engraver_group_engraver::do_pre_move_processing();
- group_staff_elems();
-}
-
-void
-Staff_engravers::group_staff_elems()
-{
- for (int i=0; i <staff_elem_l_arr_.size(); i++)
- staffline_p_->add_element(staff_elem_l_arr_[i]);
- staff_elem_l_arr_.set_size(0);
-}
void
-Staff_engravers::do_removal_processing()
+Line_group_engraver::do_removal_processing()
{
- /* this is a "destructor type function", first do children, then self. */
- Engraver_group_engraver::do_removal_processing();
- group_staff_elems();
-
staffline_p_->right_col_l_ = get_staff_info().command_pcol_l();
- Engraver::typeset_element(staffline_p_);
+ typeset_element(staffline_p_);
staffline_p_ = 0;
}
void
-Staff_engravers::do_creation_processing()
+Line_group_engraver::do_creation_processing()
{
staffline_p_ = new Line_of_staff;
staffline_p_->left_col_l_ = get_staff_info().command_pcol_l();
// don't broadcast to self.
- Engraver::announce_element(Score_elem_info(staffline_p_,0));
- Engraver_group_engraver::do_creation_processing();
+ announce_element(Score_elem_info(staffline_p_,0));
}
-IMPLEMENT_STATIC_NAME(Staff_engravers);
-IMPLEMENT_IS_TYPE_B1(Staff_engravers,Engraver_group_engraver);
-ADD_THIS_ENGRAVER(Staff_engravers);
+IMPLEMENT_STATIC_NAME(Line_group_engraver);
+IMPLEMENT_IS_TYPE_B1(Line_group_engraver,Engraver);
+ADD_THIS_ENGRAVER(Line_group_engraver);
{
return command_l_;
}
+
PCol*
Staff_info::command_pcol_l()
{
- return command_l()->pcol_l_;
+ return command_l();
}
+
PCol*
Staff_info::musical_pcol_l()
{
- return musical_l()->pcol_l_;
+ return musical_l();
}
Moment
defp->text_str_ = beam_req_l_->nplet;
defp->style_str_="italic";
t->spec_p_ = defp;
+ announce_element(Score_elem_info(t,0));
typeset_element(t);
}
+ announce_element ( Score_elem_info(beam_p_, 0));
}
}
--- /dev/null
+/*
+ swallow-perf.cc -- implement Swallow_performer
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "swallow-perf.hh"
+
+IMPLEMENT_STATIC_NAME(Swallow_performer);
+IMPLEMENT_IS_TYPE_B1(Swallow_performer, Performer);
+ADD_THIS_PERFORMER(Swallow_performer);
*/
#include "translator.hh"
+
Translator::Translator()
{
iterator_count_ = 0;
{
return false;
}
+
+
+void
+Translator::print()const
+{
+
+}
{
if ( i.origin_grav_l_arr_.size() == 2 &&
i.elem_l_->is_type_b(Vertical_group::static_name()) &&
- !i.elem_l_->y_group_element_i_ &&
- !valign_p_->contains_b( i.elem_l_) ) {
+ !i.elem_l_->y_group_element_i_ ) {
+ assert( !valign_p_->contains_b( i.elem_l_) );
valign_p_->add ( i.elem_l_ );
}
(c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
*/
-#include "break.hh"
+#include "word-wrap.hh"
#include "p-score.hh"
#include "debug.hh"
#include "p-col.hh"
+#include "spring-spacer.hh"
+
+
/** el stupido. This should be done more accurately:
It would be nice to have a Dynamic Programming type of algorithm
similar to TeX's
- */
+ */
Array<Col_hpositions>
Word_wrap::do_solve()const
{
problem_OK();
- iter_top(pscore_.cols,curcol);
+ iter_top(pscore_l_->col_p_list_,curcol);
Array<Col_hpositions> breaking;
Line_of_cols breakpoints(find_breaks());
assert(breakpoints.size()>=2);
Word_wrap::Word_wrap(PScore&ps)
: Break_algorithm(ps)
{
+ get_line_spacer = Spring_spacer::constructor;
}
spec: $(outdir)/lilypond.spec
-rpmdocs=$(addprefix Documentation/out/, $(notdir $(shell ls $(depth)/Documentation/$(outdir)/*.text)))
+rpmdocs=$(addprefix Documentation/out/, $(notdir $(shell ls $(depth)/Documentation/$(outdir)/*.text)))\
+ BUGS TODO NEWS DEDICATION ANNOUNCE README
+rpmmudocs=$(addprefix Documentation/out/, $(notdir $(shell ls $(depth)/Documentation/*.doc)))
+rpmdvis=$(rpmmudocs:.doc=.dvi)
rpmexamples= $(addprefix input/, $(notdir $(shell ls $(depth)/input/*.{ly,tex})))
sed-version= sed 's!@TOPLEVEL_VERSION@!${TOPLEVEL_VERSION}!g'
sed-date=sed 's!@DATE@!${date}!g'
-sed-examples = sed 's!@EXAMPLE_LYS@!${rpmexamples}!g'
+sed-examples = sed 's!@EXAMPLE_LYS@!${rpmexamples} ${rpmdvis}!g'
sed-docs=sed 's!@TEXT_DOCS@!${rpmdocs}!g'
$(outdir)/lilypond.spec: lilypond.spec.in $(depth)/.version
$(outdir)/%.xpm: %.gif
giftopnm $< | ppmtoxpm > $@
+
+$(outdir)/%.ps: $(outdir)/%.dvi
+ dvips -o $@ $<
+
+$(outdir)/%.dvi: $(outdir)/%.mudtex
+ latex '\batchmode \input $<'
+
+$(outdir)/%.mudtex: %.doc
+ $(depth)/bin/mudela-book --outdir=$(outdir)/ --outname=$(notdir $@) $<
+
+
#
$(outdir)/version.hh: .version
- ./$(lily_bindir)/make_version > $@
+ ./$(lily_bindir)/make-version > $@
# should this be in Rules?
# descent order into subdirectories:
#
-SUBDIRS = mf flower lib lily mi2mu \
+SUBDIRS = flower lib lily mi2mu \
Documentation bin init input tex make
#
# list of distribution files:
#
SCRIPTS = configure configure.in install-sh
-README_FILES = ANNOUNCE COPYING NEWS README TODO INSTALL.text AUTHORS.text
+README_FILES = BUGS DEDICATION ANNOUNCE COPYING NEWS README TODO INSTALL.text AUTHORS.text
EXTRA_DISTFILES= .dstreamrc .version $(README_FILES) $(SCRIPTS) $(SYMLINKS)
# do not dist ./Makefile (is copied from make/Toplevel.make)
-[This lsm-entry is not in the LSM yet.]
-
Begin3
Title: LilyPond
-Version: 0.0.75
-Entered-date: 07/22/97
-Description: LilyPond is a program which converts a music-script (mudela) into
-TeX output, or MIDI to produce multi-staff scores. Features include multiple
+Version: 0.0.76
+Entered-date: 07/28/97
+Description:
+GNU LilyPond which converts music definition files into visual or
+audio output: it can typeset formatted sheet music to a TeX file and
+and (mechanical) performances to MIDI files. Features include multiple
meters, clefs, keys, lyrics, versatile input-language, cadenzas
beams, slurs, triplets.
Keywords: music typesetting midi notation
jan@digicash.com (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: pcnov095.win.tue.nl /pub/lilypond/
- 300k lilypond-0.0.75.tar.gz
-Alternate-site:
+ 340k lilypond-0.0.76.tar.gz
+Alternate-site: prep.ai.gnu.mit.edu /pub/gnu
Original-site:
-Platform: unix/win32, GNU C++
+Platform: Unix/win32, GNU C++
Copying-policy: GPL
End
-[This lsm-entry is not in the LSM yet.]
-
Begin3
Title: LilyPond
Version: @TOPLEVEL_VERSION@
Entered-date: @DATE@
-Description: LilyPond is a program which converts a music-script (mudela) into
-TeX output, or MIDI to produce multi-staff scores. Features include multiple
+Description:
+GNU LilyPond which converts music definition files into visual or
+audio output: it can typeset formatted sheet music to a TeX file and
+and (mechanical) performances to MIDI files. Features include multiple
meters, clefs, keys, lyrics, versatile input-language, cadenzas
beams, slurs, triplets.
Keywords: music typesetting midi notation
jan@digicash.com (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: pcnov095.win.tue.nl /pub/lilypond/
- 300k lilypond-@TOPLEVEL_VERSION@.tar.gz
-Alternate-site:
+ 340k lilypond-@TOPLEVEL_VERSION@.tar.gz
+Alternate-site: prep.ai.gnu.mit.edu /pub/gnu
Original-site:
-Platform: unix/win32, GNU C++
+Platform: Unix/win32, GNU C++
Copying-policy: GPL
End
Name: lilypond
-Version: 0.0.75
+Version: 0.0.76
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: pcnov095.win.tue.nl:/pub/lilypond/lilypond-0.0.75.tar.gz
+Source0: pcnov095.win.tue.nl:/pub/lilypond/lilypond-0.0.76.tar.gz
Summary: A preprocessor to make TeX typeset music.
URL: http://www.stack.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@stack.nl>
-Icon: lelie_icon.xpm
+Icon: lelie_icon.gif
Buildroot: /tmp/lilypond_build
%description
-GNU LilyPond is a program which converts a music-script
-(mudela) into TeX output, or MIDI to produce multi-staff
-scores. Features include multiple meters, clefs, keys, lyrics,
-versatile input-language, cadenzas beams, slurs, triplets, multiple
-voices.
+GNU LilyPond which converts music definition files into visual or
+audio output: it can typeset formatted sheet music to a TeX file and
+and (mechanical) performances to MIDI files. Features include multiple
+meters, clefs, keys, lyrics, versatile input-language, cadenzas
+beams, slurs, triplets.
%prep
%setup
strip lily/out/lilypond mi2mu/out/mi2mu
make prefix="$RPM_BUILD_ROOT/usr" install
%files
-%doc Documentation/out/AUTHORS.text Documentation/out/CodingStyle.text Documentation/out/INSTALL.text Documentation/out/MANIFESTO.text Documentation/out/convert-mudela.text Documentation/out/error.text Documentation/out/faq.text Documentation/out/gnu-music.text Documentation/out/index.text Documentation/out/language.text Documentation/out/lilygut.text Documentation/out/lilyliterature.text Documentation/out/lilypond.text Documentation/out/mi2mu.text Documentation/out/mudela.text Documentation/out/other-packages.text input/beams.ly input/book.ly input/book.tex input/cadenza.ly input/collisions.ly input/coriolan-alto.ly input/error.ly input/header.ly input/keys.ly input/kortjakje.ly input/multi.ly input/pedal.ly input/rhythm.ly input/scales.ly input/scripts.ly input/scsii-menuetto.ly input/scsii-menuetto.tex input/slurs.ly input/standchen.ly input/standchen.tex input/toccata-fuga-E.ly input/twinkle.ly input/wohltemperirt.ly Documentation/lelie_logo.gif
+%doc Documentation/out/AUTHORS.text Documentation/out/CodingStyle.text Documentation/out/INSTALL.text Documentation/out/MANIFESTO.text Documentation/out/convert-mudela.text Documentation/out/error.text Documentation/out/faq.text Documentation/out/gnu-music.text Documentation/out/index.text Documentation/out/language.text Documentation/out/lilygut.text Documentation/out/lilyliterature.text Documentation/out/lilypond.text Documentation/out/mi2mu.text Documentation/out/mudela-book.text Documentation/out/other-packages.text BUGS TODO NEWS DEDICATION ANNOUNCE README input/beams.ly input/cadenza.ly input/collisions.ly input/coriolan-alto.ly input/error.ly input/header.ly input/keys.ly input/kortjakje.ly input/multi.ly input/pedal.ly input/rhythm.ly input/scales.ly input/scripts.ly input/scsii-menuetto.ly input/scsii-menuetto.tex input/slurs.ly input/standchen.ly input/standchen.tex input/toccata-fuga-E.ly input/twinkle.ly input/wohltemperirt.ly Documentation/out/mudela-course.dvi Documentation/out/mudela-man.dvi Documentation/lelie_logo.gif
/usr/bin/convert-mudela
+/usr/bin/mudela-book
/usr/bin/lilypond
/usr/lib/libflower.so
/usr/bin/mi2mu
/usr/man/man1/mi2mu.1
/usr/man/man1/lilypond.1
-/usr/man/man5/mudela.5
+/usr/man/man1/mudela-book.1
/usr/man/man1/convert-mudela.1
/usr/lib/texmf/texmf/tex/lilypond/
-/usr/lib/texmf/texmf/fonts/source/lilypond/
/usr/share/lilypond/
%post
-echo please run texhash to update TeX directory listings 1>&2
Summary: A preprocessor to make TeX typeset music.
URL: http://www.stack.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@stack.nl>
-Icon: lelie_icon.xpm
+Icon: lelie_icon.gif
Buildroot: /tmp/lilypond_build
%description
-GNU LilyPond is a program which converts a music-script
-(mudela) into TeX output, or MIDI to produce multi-staff
-scores. Features include multiple meters, clefs, keys, lyrics,
-versatile input-language, cadenzas beams, slurs, triplets, multiple
-voices.
+GNU LilyPond which converts music definition files into visual or
+audio output: it can typeset formatted sheet music to a TeX file and
+and (mechanical) performances to MIDI files. Features include multiple
+meters, clefs, keys, lyrics, versatile input-language, cadenzas
+beams, slurs, triplets.
%prep
%setup
%files
%doc @TEXT_DOCS@ @EXAMPLE_LYS@ Documentation/lelie_logo.gif
/usr/bin/convert-mudela
+/usr/bin/mudela-book
/usr/bin/lilypond
/usr/lib/libflower.so
/usr/bin/mi2mu
/usr/man/man1/mi2mu.1
/usr/man/man1/lilypond.1
-/usr/man/man5/mudela.5
+/usr/man/man1/mudela-book.1
/usr/man/man1/convert-mudela.1
/usr/lib/texmf/texmf/tex/lilypond/
-/usr/lib/texmf/texmf/fonts/source/lilypond/
/usr/share/lilypond/
%post
-echo please run texhash to update TeX directory listings 1>&2
+++ /dev/null
-#
-# project LilyPond -- the musical typesetter
-# title makefile for yet to add in MF files
-# file ../Makefile
-#
-# Copyright (c) 1997 by
-# Jan Nieuwenhuizen <jan@digicash.com>
-# Han-Wen Nienhuys <hanwen@stack.nl>
-#
-
-# subdir level:
-#
-depth = ..
-#
-
-# generic variables:
-#
-include ./$(depth)/make/Variables.make
-
-include ./$(depth)/.version
-
-# descent order into subdirectories:
-#
-SUBDIRS =
-#
-
-#
-include ./$(depth)/make/Files.make
-MFFILES:=$(wildcard *.mf)
-
-EXTRA_DISTFILES = $(MFFILES) README
-
-
-# list of custom libraries:
-#
-CUSTOMLIBES = \
-
-LOADLIBES +=
-#
-
-# main target of this module:
-#
-MAINTARGET =
-
-default: $(MAINTARGET)
-#
-
-# generic targets and rules:
-#
-include ./$(depth)/make/Targets.make
-include ./$(depth)/make/Rules.make
-#
-
-lily-mfdir = $(MFDIR)/lilypond
-
-localinstall:
- $(INSTALL) -d $(lily-mfdir)
- $(INSTALL) -m 644 $(MFFILES) $(lily-mfdir)
-
-localuninstall:
- for i in $(MFFILES); do rm -f $(lily-mfdir)/$$i; done
- -rmdir $(lily-mfdir)
+++ /dev/null
-This is from the package MusixTeX, version T.73 (Taupin version.)
-
-The documentation states:
-
- \begin{center}
-
- Although one of the authors contested that point once the
- common work had begun, \musixtex{} may be freely copied,
- duplicated and used. However, since it is intended to be a
- \ital{freeware} you are not allowed to sell it, and the fee
- you may ask for distributing it must be limited to
- maintenance, support and duplication costs. You may take parts
- of it to include in other packages, but no packages called
- \musixtex{} may be distributed under this name if different
- from the original distribution (except obvious bug corrections
- or text font adaptations for specific implementations).
-
- \musixtex{} may be included in further commercial packages,
- provided that no fee is charged for \musixtex{} itself.
-
- \end{center}
-
-
-A part (the fonts) are included in this package, which is not called
-\musixtex, so this not a copyright infringement.
-
-
-MusixTeX is copyright 19?? by:
-
- Daniel Taupin,
-
- Laboratoire de Physique des Solides (associ\'e au CNRS),
- b\^atiment 510, Centre Universitaire, F-91405 ORSAY Cedex
- <taupin@lps.u-psud.fr>
-
- Ross Mitchell
-
- CSIRO Division of Atmospheric Research, Private Bag No.1,
- Mordialloc, Victoria 3195, Australia
-
- Andreas Egler
-
- (Ruhr--Uni--Bochum) Ursulastr. 32 D-44793 Bochum
+++ /dev/null
-% this is musexgen.mf
-
-% Here are two types of pianobrackets available, they are absolute compatible,
-% so choose this one you prefer (search for '%!!!')
-
-path p;
-picture save_pic;
-
-pen thin_pen, med_pen;
-thin_pen:= pencircle scaled max(1,.2pt+blacker);
-med_pen:= pencircle scaled med;
-
-%%%%%%%
-message ("<big braces>");
-%%%%%%%
-
-firstbrace:=20; % smallest brace is 2*20 pt (\simeq 14mm)
-lastbrace:=67; % largest brace is 2*67 pt (\simeq 47mm)
-
-%%% from Stanislav Kneifl
-
-def drawpianobracket (expr height) =
- u# := 1nhh#/5pt# * 1pt#;
- v# := (height/40) * 1pt#;
- define_pixels (u, v);
-% beginchar (height-firstbrace, 1.25nhh#, 0, 0);
- beginchar (height-firstbrace, 0, 0, 0);
- z1 = origin;
- z2 = (4.7u, 7v);
- z3 = (3.6u, 16.5v);
- z4 = (1.9u, 25v);
- z5 = (2.28u, 32v);
- z6 = (w, 40v);
- penpos1 (max(1,0.1u), 125);
- penpos2 (1.2u, 180);
- penpos3 (3.2u, 195);
- penpos4 (2.5u, 180);
- penpos5 (1.14u, 180);
- penpos6 (max(2,0.3u), 150);
- penstroke z1e{dir 35}..z2e..z3e..z4e..z5e..{dir 60}z6e;
- currenttransform := identity reflectedabout ((0,0),(1,0));
- penstroke z1e{dir 35}..z2e..z3e..z4e..z5e..{dir 60}z6e;
- currenttransform := identity;
-% inserted
- currentpicture:=currentpicture shifted (round(-1.75nhh), 0);
-%
- endchar;
-enddef;
-
-def bigbrace(expr v) =
- beginchar (v-firstbrace, 0, 0, 0);
- " brace vsize "&decimal round(2v*pt#)&"pt";
- vwidth:=v*pt;
- hwidth:=max(.1vwidth,3.25pt);
- hwidth:=min(hwidth,6.5pt);
- actwidth:=.035vwidth;
- x1=.25nhw; y1=vwidth;
- x2l=-.8hwidth; y2=2/3vwidth;
- x3r=.2hwidth; y3=1/3vwidth;
- x4=-hwidth; y4=0;
- penpos1(max(1,.25pt),-35);
- penpos2(1.5med+actwidth,40);
- penpos3(1.75med+actwidth,45);
- penpos4(max(1,.2pt),-90);
- penstroke z1e..z2e..z3e..{left+sw}z4e;
- currentpen:= pencircle; draw z1..z2..z3..{left+sw}z4;
- addto currentpicture also currentpicture reflectedabout (origin, right);
- penlabels(1,2,3,4);
- currentpicture:= currentpicture shifted (round(-.75nhh), 0);
- endchar;
-enddef;
-
-%!!! comment the line 'bigbrace' and uncomment the line 'drawpianobracket'
-% or leave it like it is !!!
-
-for v=firstbrace upto lastbrace :
- bigbrace (v);
-% drawpianobracket (v);
-endfor;
-
-%%%%%%%
-message ("<glissandi-elements>");
-%%%%%%%
-% glissando{slide} (slope [degree])
-
-def glissando (expr theta)=
- x1=-1; y1=0; z2=z1+(.5nhw,0); z3=z1+(nhw+1,0);
- p:= z1{1.25up+right}..{1.25down+right}z2{1.25down+right}..{1.25up+right}z3;
- pickup penrazor scaled (.075nhw+thick) rotated (theta+65);
- draw p rotated theta;
- labels (1,2,3);
-enddef;
-
-for slope=1 upto 8:
-
- beginchar(56+slope-1, (cosd(10slope))*nhw#,(sind(10slope))*nhw#, 0);
- " glissando element slope "&decimal (10slope)&" degree";
- glissando (10slope);
- save_pic:= currentpicture;
- endchar;
-
- beginchar(64+slope-1, (cosd(10slope))*nhw#, (sind(10slope))*nhw#, 0);
- " glissando element slope "&decimal (-10slope)&" degree";
- currentpicture:= save_pic reflectedabout (origin, right);
- endchar;
-
-endfor;
-
-%%%%%%%
-message ("<guitar chords>");
-%%%%%%%
-def tabulatur (expr nd)=
- hwidth:=1/5w;
- x1=x2=y2=y3=0; x3=w; y1=-nd;
- fill unitsquare xscaled (w+2thinwidth) yscaled (med+.2pt)
- shifted(-thinwidth,0);
- pickup thin_pen;
- for v=1 upto 5 :
- draw (z2--z3) shifted (0,v*-hwidth);
- endfor;
-
- for v=0 upto 5 :
- draw (z1--z2) shifted (v*hwidth,0);
- endfor;
- labels (1,2,3);
-enddef;
-
-%beginchar(72, 15/4nhw#, 0, 0);" grid";
-% tabulatur (54/10nhh);
-%endchar;
-
-%beginchar(73, 15/8nhw#, 0, 0); " dot";
-% fill fullcircle scaled .675nhh shifted (w,-.45nhh);
-%endchar;
-
-%beginchar(74, 15/4nhw#, 0, 0); " bar";
-% fill unitsquare xscaled w yscaled .3nhh shifted (0,-.6nhh);
-%endchar;
-
-shift:=.15nhh;
-def Circle (expr nh)=
- x1l=.1w; x2=x4=.5w; x3l=.9w;
- y1=y3=.5nh+shift; y2=.1nh+shift; y4=.9nh+shift;
- penpos1(med, 0);
- penpos2(thinwidth,90);
- penpos3(med,180);
- penpos4(thinwidth, 270);
- penstroke z1e..z2e..z3e..z4e..cycle;
- pickup pencircle; draw z1..z2..z3..z4..cycle;
-enddef;
-
-%beginchar(75, 3/4nhw#, 0, 0); " circle";
-% Circle (.9nhh);
-%endchar;
-
-def Cross (expr nh)=
- x1=x3=.2w; x2=x4=.8w;
- y1=y4=.2nh+shift; y2=y3=nh-.2nh+shift;
- pickup med_pen;
- draw z1--z2; draw z3--z4;
-% labels (1,2,3,4);
-enddef;
-
-%beginchar(76, 3/4nhw#, 0, 0); " cross";
-% Cross (.9nhh);
-%endchar;
-
-%beginchar(77, 3/4nhw#, 0, 0); " blank";
-%endchar;
-
-beginchar(72, 3nhw#, 0, 0);" small grid";
- tabulatur (108/25nhh);
-endchar;
-
-beginchar(73, 3/2nhw#, 0, 0); " small dot";
- fill fullcircle scaled .54nhh shifted (w,-.36nhh);
-endchar;
-
-beginchar(74, 3nhw#, 0, 0); " small bar";
- fill unitsquare xscaled w yscaled .24nhh shifted (0,-.48nhh);
-endchar;
-
-beginchar(75, 3/5nhw#, 0, 0); " small circle";
- Circle (.72nhh);
-endchar;
-
-beginchar(76, 3/5nhw#, 0, 0); " small cross";
- Cross (.72nhh);
-endchar;
-
-% the next seems to be senseless, but it isn't
-
-beginchar(77, 3/5nhw#, 0, 0); " small blank";
-endchar;
+++ /dev/null
-
-font_identifier:="musix11";
-
-mode_setup;
-
-font_size 10.24pt#;
-
-nhh#:=2.56pt#;
-nhw#:=3.072pt#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.064pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-
-font_identifier:="musix13";
-
-mode_setup;
-
-font_size 12.8pt#;
-
-nhh#:=3.2pt#;
-nhw#:=3.84pt#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.08pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-
-font_identifier:="musix16";
-
-mode_setup;
-
-font_size 16pt#;
-
-nhh#:=4pt#;
-nhw#:=4.8pt#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.1pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-
-font_identifier:="musix20";
-
-mode_setup;
-
-font_size 20pt#;
-
-nhh#:=5pt#;
-nhw#:=1.2*nhh#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.125pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-
-font_identifier:="musix24";
-
-mode_setup;
-
-font_size 24pt#;
-
-nhh#:=6pt#;
-nhw#:=1.2nhh#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.15pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-
-font_identifier:="musix25";
-
-mode_setup;
-
-font_size 25pt#;
-
-nhh#:=6.25pt#;
-nhw#:=7.5pt#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.15pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-
-font_identifier:="musix29";
-
-mode_setup;
-
-font_size 29pt#;
-
-nhh#:=7.2pt#;
-nhw#:=1.2*nhh#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.15pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-% next changes: - redesigning accidentals
-% - new accents
-% - new gregorian symbols
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% this is musixgen.mf (c)
-%
-% Version T.70 [March 97]
-% - double shap corrected by Julian Gilbey (strange paths)
-%
-% Version T.59 [September 96]
-% - added one more gregorian symbol (126)
-%
-% Version T.40 [September 95]
-% - corrected gregorianFclef (123)
-%
-% Version 0.37 [March 95]
-% - introduced reverseAllabreve (122)
-%
-% Version 0.25 [December 94]
-% - some new chars
-% - added the beamfonts at pos x+128 to save memory
-% - changed coda to be centered
-% - changed the flags
-% - changed the position of some chars to save time
-%
-% ... - trouble shooting, minor changes
-%
-% Version 0.99b[April 94]
-% - added the new signs from Daniel Taupin
-%
-% Version 0.99 [February 94]
-% -'bravely' changed the tfm informations to save memory
-% - redesigned chars 14, 15, 35, 36, 53, 71, 72, 80, 81, 86, 93
-% - removed * 'never used' chars 37-39, 55-57, 69-70,
-% 77-79, 91-99, 101-119
-% * (de)crescendi 16-23 -> now in musixlin
-% - introduced some new chars 0-11, 16-23, 37-39, 57, 77-79,
-% 99-117
-% - changed the position of some chars to save memory
-%%%%%%%%%%
-% this was musicgen.mf
-%
-% Version 4.89 [September 93] Andreas Egler
-% - blacker influence now
-% - redesigned chars 71, 72, 53, 123
-%
-% Version 4.88 [January 93] Ross Mitchell
-% - redesigned chars 63, 64, 65, 66
-%
-% Version 4.87 [] Daniel Taupin
-%
-% Version 2.00 [] Daniel Taupin
-%
-% Version 1.00 [August 86] Angelika Schofer/Andrea Steinbach
-%
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-% free positions: 125-127, 188-191, 252-255
-% heights : 0, 0.5, 1, 1.5, 2.25, 3.25, 4, 4.75, 5.25
-% depths : 0, 0.5, 1, 1.5, 2.25
-
-%{{{ This always indicates a lowres fix to avoid seperated points
-%}}} and/or 'invisible' lines. It doesn't affect higher resolutions !!
-
-pair pone, ptwo;
-transform t;
-path p;
-
-hlthick=.2pt;
-lthick=.4pt;
-
-pen line_pen, med_pen, coda_pen, thin_pen;
-med_pen:= pencircle scaled med;
-line_pen:= pencircle scaled lthick;
-coda_pen:= pencircle xscaled 1.25thick yscaled max(1,.75med);
-thin_pen:= pencircle scaled max(1,.25pt);
-
-apog_fact=.75;
-apog_nhw#=apog_fact*nhw#;
-
-picture save_pic, elem_pic;
-
-%%%%%%%%%%%%%%%
-% basic def's %
-%%%%%%%%%%%%%%%
-
-def savepic = save_pic:= currentpicture enddef;
-def save_elempic = elem_pic:= currentpicture enddef;
-def callpic = currentpicture:= save_pic enddef;
-
-def mirror (expr pone, ptwo) =
- currentpicture:=currentpicture reflectedabout(round(pone),round(ptwo))
-enddef;
-
-def add_mirror (expr pone, ptwo) =
- addto currentpicture also currentpicture
- reflectedabout (round(pone), round(ptwo))
-enddef;
-
-def call_mirror (expr pone, ptwo) = callpic; mirror (pone, ptwo) enddef;
-
-def add_shift (expr pone, ptwo) =
- addto currentpicture also currentpicture shifted (pone, ptwo)
-enddef;
-
-def call_add_shift (expr pone, ptwo) =
- callpic; add_shift (pone, ptwo)
-enddef;
-
-def add_elempic (expr pone, ptwo) =
- addto currentpicture also elem_pic shifted (pone, ptwo)
-enddef;
-
-def call_add_save_elempic (expr pone, ptwo) =
- callpic; add_elempic(pone, ptwo); savepic
-enddef;
-
-def shift_pic (expr pone, ptwo) =
- currentpicture:=currentpicture shifted (round(pone),round(ptwo))
-enddef;
-
-def fill_circle (expr diameter, zshift) =
- fill fullcircle scaled diameter shifted zshift
-enddef;
-
-def fill_square (expr xwidth, ywidth, zshift) =
- fill unitsquare xscaled xwidth yscaled ywidth shifted zshift
-enddef;
-
-%
-
-def staff=
- for i=0 upto 4:
- pickup pencircle yscaled lthick;
- draw (-5nhw,i*nhh)--(5nhw,i*nhh);
- endfor
-enddef;
-
-def Staff=
- for i=0 upto 4:
- pickup pencircle yscaled lthick;
- draw (-5nhw,(i*nhh-.5nhh))--(5nhw,(i*nhh-.5nhh));
- endfor
-enddef;
-
-def upstem=
- fill_square (lthick, 5nhh, (0,-5nhh))
-enddef;
-
-def downstem=
- fill_square (lthick, 5nhh, (nhw-hlthick,0))
-enddef;
-
-% eobasicdefs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-%%%%%%%
-message ("<dots & par's>");
-%%%%%%%
-
-beginchar(0, 0, 0, 0); "duration dot"; % correct 3=>0 DT
- fill_circle (1/3nhh+blacker, (1.5nhw, 0));
- save_elempic;
- savepic;
-endchar;
-
-beginchar(1, 0, 0, 0); "double duration dot";
- call_add_shift (.5nhw, 0);
- savepic;
-endchar;
-
-beginchar(2, 0, 0, 0); "triple duration dot";
- callpic;
- add_elempic (nhw, 0);
-endchar;
-
-beginchar(3, 0, nhh#, nhh#); "left parenthesis"; % correct 0=>3 DT
- x11=x13=-.1nhw; y12=0; x12=-.3nhw; y11=-y13=-.75nhh;
- pickup med_pen;
- draw z11..z12..z13;
- savepic;
-endchar;
-
-beginchar(4, 0, nhh#, nhh#); "right parenthesis";
- call_mirror ((.5nhw,0),(.5nhw,1));
-endchar;
-
-beginchar(5, 0, nhh#, nhh#); "cautionary parentheses";
- callpic;
- add_mirror ((.3nhw, 0),(.3nhw, 1));
-endchar;
-
-beginchar(6, 0, nhh#, nhh#); "cautionary wide parentheses";% -> bb
- callpic;
- add_mirror ((.55nhw, 0),(.55nhw, 1));
-endchar;
-
-%%%%%%%
-message("<accents>");
-%%%%%%%
-
-beginchar(120, 0, 1.5nhh#, 0); "harmonics";
- pickup thin_pen;
- draw fullcircle scaled .5nhw shifted (.5nhw, nhh);
-endchar;
-
-%beginchar(XX, 0, 1.5nhh#, 0); "???";
-% x1=0; x2=.5nhw; x3=nhw-x1; x3=x4+.25nhw; x6=x1+med;
-% y1=y6=y4=y3=nhh; y2=y1+nhh;
-% z5-z6=whatever*(z2-z1);
-% z5-z4=whatever*(z2-z3);
-% fill z1--z2--z3--z4--z5--z6--cycle;
-% fill_circle (thick, ((x5,y1+.5thick)));
-% savepic;
-%endchar;
-
-beginchar(20, 0, 2.25nhh#, 0); "upper sforzato";
- x1=1/12nhw; x2=.5nhw; x3=nhw-x1; x3=x4+.25nhw; x6=x1+med;
- y1=y6=y4=y3=nhh; y2=y1+nhh;
- z5-z6=whatever*(z2-z1);
- z5-z4=whatever*(z2-z3);
- fill z1--z2--z3--z4--z5--z6--cycle;
- savepic;
-endchar;
-
-beginchar(21, 0, 0, 2.25nhh#); "lower sforzato";
- call_mirror (origin, right);
-endchar;
-
-beginchar(22, 0, nhh#, 0); "downbow";
- fill_square (thin, nhh, (-thin, .4nhh));
- fill_square (.5nhw+thin+1, .8beamht+thin, (-thin, nhh));
- add_mirror ((.5nhw,0),(.5nhw,1));
-endchar;
-
-beginchar(23, 0, 1.5nhh#, 0); "upbow";
- pickup med_pen;
- draw (.15nhw, 1.7nhh)--(.5nhw, .2nhh);
- add_mirror ((.5nhw,0),(.5nhw,1));
-endchar;
-
-beginchar(24, 0, nhh#, 0); "upper staccato";
- fill_circle (.275nhw+blacker, (.5nhw, nhh));
- savepic;
-endchar;
-
-beginchar(25, 0, 0, nhh#); "lower staccato";
- call_mirror (origin, right);
-endchar;
-
-beginchar(18, 0, nhh#, 0); "upper tenuto/staccato";
- fill_square (nhw, 1.25med, (0, 1.2nhh-.625med));
- fill_circle (.275nhw+blacker, (.5nhw, .9nhh));
- savepic;
-endchar;
-
-beginchar(19, 0, 0, nhh#); "lower tenuto/staccato";
- call_mirror (origin, right);
-endchar;
-
-beginchar(26, 0, nhh#, 0); "upper portato (tenuto)";
- fill_square (nhw, 1.25med, (0, nhh-.625med));
- savepic;
-endchar;
-
-beginchar(27, 0, 0, nhh#); "lower portato (tenuto)";
- call_mirror (origin, right);
-endchar;
-
-beginchar(28, 0, 1.5nhh#, 0); "upper staccatissimo";
- rayon:= thin+.125nhh;
- x1=x3=x2+rayon=x4-rayon=.5nhw;
- y2=y4=y1-rayon=y3+.5nhh=1.15nhh;
- fill z3--z4{up}..z1..{down}z2--cycle;
- savepic;
-endchar;
-
-beginchar(29, 0, 0, 1.5nhh#); "lower staccatissimo";
- call_mirror (origin, right);
-endchar;
-
-beginchar(30, 0, 2.25nhh#, 0); "upper marcato";
- pickup med_pen;
- draw (-.2nhw, 1.9nhh)--(1.2nhw, 1.5nhh)--(-.2nhw, 1.1nhh);
- savepic;
-endchar;
-
-beginchar(31, 0, 0, 2.25nhh#); "lower marcato";
- call_mirror (origin, right);
-endchar;
-
-%%%%%%%
-message ("<noteheads>");
-%%%%%%%
-
-NHW=nhw+hlthick;
-
-beginchar(7, 0, .5nhh#, .5nhh#); "quarter note";
-% makeshift, expedience
-if pixels_per_inch=600:
- if NHW>50: corNHW=1.04*NHW; else: corNHW=1.04*NHW+1; fi
- fill fullcircle xscaled corNHW yscaled 1.85h
- rotated 20 shifted (.5NHW-.5, 0);
-else:
- corNHW=1.065*NHW;
- fill fullcircle xscaled corNHW yscaled 1.85h
- rotated 20 shifted (.5NHW, 0);
-fi
-endchar;
-
-beginchar(8, 0, .5nhh#, .5nhh#); "half note";
- penpos1(max(1,2hlthick), 0);
- penpos3(max(1,2hlthick), 180);
- penpos2(thick,-90);
- penpos4(thick, 90);
- -x1l = .53NHW;
- x3l = .5NHW;
- x2 = x4 = y1 = y3 = 0;
- y2l =-y4l = h;
- penstroke (z1e{up}..z2e{right}..z3e{down}..z4e{left}..cycle)
- rotated 20 shifted (.5NHW, 0);
-endchar;
-
-beginchar(9, 0, .5nhh#, .5nhh#); "whole note";
- x1= y1 = y3 = y5 = y7 = 0;
- x3= 2x2 = 2x4 = 2x6 = 2x8 = 5/4nhw;
- y2=-y4 = h;
- x5= x3-x7 = x1+.375nhw-blacker;
- y6=-y8 = y2-.1thin;
- fill z1{curl3}..z2..{curl3}z3{curl3}..z4..{curl3}cycle;
- unfill (z5..z6..z7..z8..cycle) rotatedaround ((x2,0), 45) shifted (.5,.5);
-%{{{
- currentpen:= pencircle;
- draw rt z1{curl3}..bot z2..{curl3}lft z3{curl3}..top z4..{curl3}cycle;
-%}}}
- labels(range 1 thru 8);
- savepic;
-endchar;
-
-beginchar(56, 0, .5nhh#, .5nhh#); "whole note with | --> |O|";
- callpic;
- fill_square (.6thick, nhh, (-.55thick,-.5nhh));
- fill_square (.6thick, nhh, (5/4nhw-.05thick,-.5nhh));
-endchar;
-
-beginchar(32, 0, .5nhh#, .5nhh#); "brevis";% 2 whole notes
- fill_square (5/4nhw, .25nhh, (0,.25nhh));
- add_mirror (origin, right);
- x1=x2=0; x3=x4=5/4nhw; y1=-y2=y3=-y4=.7nhh;
- pickup line_pen;
- draw z1--z2; draw z3--z4;
- savepic;
-endchar;
-
-beginchar(39, 0, .5nhh#, .5nhh#); "longa";% 4 whole notes
- callpic;
- pickup line_pen;
- draw (5/4nhw,-.7nhh)--(5/4nhw,-1.7nhh);
-endchar;
-
-beginchar(36, 0, .5nhh#, .5nhh#); "maxima";% 8 whole notes
- fill_square (5/2nhw, .3nhh, (0,.2nhh));
- add_mirror (origin, right);
- pickup line_pen;
- draw (0,.7nhh)--(0,-.7nhh); draw (5/2nhw,.7nhh)--(5/2nhw,-1.7nhh);
-endchar;
-
-beginchar(37, 0, .5nhh#, .5nhh#); "filled diamond";% -> triangle
- fill unitsquare scaled (.5*sqrt(2)*NHW) rotated -45;
-endchar;
-
-def square (expr mw)=
- fill_square (sqrt(2)*.5mw, max(1,thin), origin) rotated -45;
- fill_square (sqrt(2)*.5mw, .15nhw, (0,-.15nhw)) rotated 45;
- save_elempic;
- mirror (origin,up);
- mirror (origin,left);
- shift_pic (mw+.5,0);
- add_elempic(0,0);
-% mirror (origin,right);% I've seen this too, somewhere ...
-enddef;
-
-beginchar(38, 0, .5nhh#, .5nhh#); "unfilled diamond";% -> rimshot
- square (NHW);
-endchar;
-
-beginchar(99, 0, .5nhh#, .5nhh#); "oldstyle quarter notehead up";
- x1=x4=0; x2=x3=NHW; y1=y2=-y3=-y4=h-hlthick;
- fill z1{dir-10}..z2--z3{dir-170}..z4--cycle;
- savepic;
-endchar;
-
-beginchar(100, 0, .5nhh#, .5nhh#); "oldstyle quarter notehead down";
- call_mirror(origin, right);
-endchar;
-
-beginchar(101, 0, .5nhh#, .5nhh#); "oldstyle half notehead up";
- pthick:=.2nhh;
- x1=0; x2=NHW; y1=y2=h-.5pthick+hlthick;
- pickup penrazor scaled pthick rotated 90;
- draw z1{dir-10}..z2;
- add_shift (0, -nhh+pthick);
- fill_square (lthick, nhh-hlthick, (0, -h+hlthick));
- fill_square (lthick, nhh-hlthick, (nhw-hlthick, -h+hlthick));
- savepic;
-endchar;
-
-beginchar(102, 0, .5nhh#, .5nhh#); "oldstyle half notehead down";
- call_mirror(origin, right);
-endchar;
-
-beginchar(111, 0, .5nhh#, .5nhh#); "cross"; % -> closed hihat
- x1=0; x2=nhw; y1=-.5nhw; y2=-y1;
- pickup med_pen;
- draw top rt z1--bot lft z2;
- add_mirror((.5nhw,0),(.5nhw,1));
- savepic;
-endchar;
-
-beginchar(112, 0, .5nhh#, .5nhh#); "halfcircled cross";% -> halfclosed hihat
- callpic;
- pickup thin_pen;
- draw halfcircle scaled nhw shifted (.5nhw,0);
-endchar;
-
-beginchar(113, 0, .5nhh#, .5nhh#); "circled cross";% -> open hihat
- callpic;
- pickup thin_pen;
- draw fullcircle scaled nhw shifted (.5nhw,0);
-endchar;
-
-def doublesharp (expr mw, xshift)=
- x1=y2=x3=0; y1=x2=y4=.5mw; y3=.5mw-x4=.1mw;
- z4'=.925[z3,z4]; z3'=.925[z4,z3]; % ***
- penpos2(max(1,thin),45);
-%%% a 'nicer' look for 'high'res-printers gives
-if pixels_per_inch > 500:
- fill z1..{dir-125}z3'{dir35}..{se}z2l--z2r--(z1+(eps,0))--cycle;
- fill z1..{dir35}z4'{dir-125}..{se}z2r--z2l--(z1-(eps,0))--cycle; % ***
-else :
-%%% but this causes 'strange path' on lower resolutions
- fill z1..{dir-110}z3'{dir30}..{se}z2l--z2r--(z1+(eps,0))--cycle;
- fill z1..{dir20}z4'{dir-120}..{se}z2r--z2l--(z1-(eps,0))--cycle; % ***
-fi
-%{{{
- currentpen:= pencircle; draw z1--(x2+1,y2-1);% draw (x3'+1,y3'+1)--z5';
-%}}}
-% add_mirror ((0,.5mw),(.5mw,0)); % ***
- add_mirror ((.5mw,-.5mw),(.5mw,.5mw));
- add_mirror (origin, right);
- shift_pic (xshift, 0);
-enddef;
-
-beginchar(114, 0, .5nhh#, .5nhh#); "doublesharp notehead";% -> ride cymbal
- doublesharp (.95nhw,0.025nhw);
- savepic;
-endchar;
-
-beginchar(115,0, .5nhh#, .5nhh#);"circled doublesharp notehead";%->crash cymbal
- callpic;
- pickup thin_pen;
- draw fullcircle scaled nhw shifted (.5nhw,0);
-endchar;
-
-beginchar(116, 0, .5nhh#, .5nhh#); "triangle";% -> rattle
- x1=y1=y2=0; x2=2x3=nhw; y3=.8h;
- pickup med_pen;
- draw z1--z2--z3--z1;
-endchar;
-
-beginchar(117, 0, .5nhh#, .5nhh#); "bongo cross";
- pickup med_pen;
- draw (0,0)--(nhw,0);
- draw (0.5nhw,-0.5nhw) -- (0.5nhw,0.5nhw);
-endchar;
-
-beginchar(118, 0, .5nhh#, .5nhh#); "rhombus";% -> shaker
- x1=x4=y2=y4=0; y1=-y3=-h; x2=x3=NHW;
- fill z1--z2--z3--z4--cycle;
-endchar;
-
-beginchar(95, 0, .5nhh#, .5nhh#); "gregorian square";
- x1=x4=0; x2=x3=gregwidth; y1=y2=-y3=-y4=.5gregwidth-lthick;
- fill z1{dir 15}..z2--z3{dir 165}..z4--cycle;
- shift_pic(0,-hlthick);
- savepic;
-endchar;
-
-beginchar(96, 0, .5nhh#, .5nhh#); "gregorian square left";
- callpic;
- fill_square (med, 1.5nhh,(0, -1.5nhh));
-endchar;
-
-beginchar(97, 0, .5nhh#, .5nhh#); "gregorian square right";
- callpic;
- fill_square (med, 1.5nhh,(gregwidth-med, -1.5nhh));
- savepic;
-endchar;
-
-beginchar(124, 0, .5nhh#, .5nhh#); "porrectus";
- x1=x4=0; x2=x3=2.5*gregwidth; y1=-y4=.5gregwidth-lthick; y2=y1-nhh; y3=y4-nhh;
- fill z1..{right}z2--z3{left}..z4--cycle; shift_pic(0,hlthick);
- fill_square (med, 1.5nhh,(0, -1.5nhh));
-endchar;
-
-beginchar(125, 0, .5nhh#, .5nhh#); "quilisma";
- qdecalage:=.12*gregwidth;
- x1=x4=-0.2*gregwidth; x2=x3=1.2*gregwidth;
- y1+qdecalage=y2-qdecalage=.5gregwidth-lthick;y1=-y3; y2=-y4;
- fill z1--z2--z3--z4--cycle;
- pickup med_pen;
-
- draw z4--(z1+0.4*(z1-z4));
- draw (0.667z4+0.333z3)--((0.667z1+0.333z2)+0.4*(z1-z4));
- draw (0.333z4+0.667z3)--((0.333z1+0.667z2)+0.4*(z1-z4));
- draw z3--(z2+0.4*(z1-z4));
- shift_pic(0,-hlthick);
-endchar;
-
-beginchar(126, 0, .5nhh#, .5nhh#); "mirrored gregorian square";
- x1=x4=0; x2=x3=gregwidth; y1=y2=-y3=-y4=-.5gregwidth+lthick;
- fill z1{dir -15}..z2--z3{dir -165}..z4--cycle;
- shift_pic(0,+hlthick);
-endchar;
-
-
-
-%%%%%%%
-message ("<flags>");
-%%%%%%%
-
-flagw:=.8nhw;
-flagthick:=nhh;
-flagthin:=5thinwidth;
-
-def flagshape
-(expr contflag, width, height, flgthick, flgthin, shifty, flagsense) =
- penpos1(flgthick+blacker, 90); % .1
- penpos2(3.25flgthin+blacker, 70);%
- x1 = 0; % .2
- y1 = height+shifty-.5flgthick; %
- x2 = 3/8width; % .3
- y2 = y1-.45flgthick; %
- x3 = width-flgthin/2; % .4(.4)
- y3 = y1-1.5flgthick;
-
- if contflag=1: x4 = x3-.4width; y4 = shifty;
- else: x4 = x3; y4 = 2.5flagthick-2flgthick; fi
- if flagsense>0: penpos3(1.15flgthin, 35);
- else: penpos3(.8flgthin, 0); fi
-
- penstroke z1e..z2e..z3e{down}..z4;
-%{{{
- currentpen:= pencircle; draw lft z1..z2..z3{down}..z4;
-%}}}
- penlabels(1,2,3,4)
-enddef;
-
-def mirror_flag(expr sense)= if sense<0: mirror((0,h/2),(1,h/2));fi enddef;
-
-def cflag (expr sense) =
- flagshape(1, flagw, 3nhh, flagthick, flagthin, 0, sense);
- mirror_flag(sense);
- savepic;
-enddef;
-
-def ccflag (expr sense) =
- flagshape(5, flagw, 2.25nhh, 2/3flagthick, flagthin, flagthick, sense);
- save_elempic;
- clearxy;
- flagshape(1, flagw, 2.5nhh, 2/3flagthick, flagthin, 0, sense);
- savepic;
- mirror_flag(sense);
-enddef;
-
-def addflag (expr sense, shifty) =
- call_add_save_elempic (0, shifty*.75flagthick);
- mirror_flag(sense);
-enddef;
-
-def cccflag (expr sense) = addflag(sense, 1) enddef;
-def ccccflag (expr sense) = addflag(sense, 2) enddef;
-def cccccflag (expr sense) = addflag(sense, 3) enddef;
-
-beginchar(40, 0, 3.25nhh#, 0); "8th flag up";
- cflag(1);
- shift_pic (0, .5nhh+.5);
-endchar;
-
-beginchar(12, 0, 3.25nhh#, 0); "acciacaturra stem up";
- callpic;
- pickup med_pen;
- x1=-.25nhw; y1=.2h; x2=1.1nhw; y2=y1+.6(x2-x1);
- draw z1--z2;
- shift_pic (0, .5nhh+.5);
-endchar;
-
-beginchar(41, 0, 3.25nhh#, 0); "16th flag up";
- ccflag(1);
- shift_pic (0, .25nhh);
-endchar;
-
-beginchar(42, 0, 4nhh#, 0); "32th flag up";
- cccflag(1);
- shift_pic (0, .25nhh);
-endchar;
-
-beginchar(43, 0, 4.75nhh#, 0); "64th flag up";
- ccccflag(1);
- shift_pic (0, .25nhh);
-endchar;
-
-beginchar(44, 0, 5.5nhh#, 0); "128th flag up";
- cccccflag(1);
- shift_pic (0, .25nhh);
-endchar;
-
-%%%
-% flags up should be wider
-%%%
-flagw:=nhw;
-
-beginchar(45, 0, 3.25nhh#, 0); "8th flag down";
- cflag(-1);
- shift_pic (0,-.5nhh-.5);
-endchar;
-
-beginchar(13, 0, 3.25nhh#, 0); "acciacaturra stem down";
- callpic;
- pickup med_pen;
- x1=-.25nhw; y1=1.6nhh; x2=1.2nhw; y2=y1+.6(x2-x1);
- draw z1--z2;
- shift_pic (0,-.5nhh-.5);
-endchar;
-
-beginchar(46, 0, 3.25nhh#, 0); "16th flag down";
- ccflag(-1);
- shift_pic (0,-.25nhh);
-endchar;
-
-beginchar(47, 0, 4nhh#, 0); "32th flag down";
- cccflag(-1);
- shift_pic (0,-.25nhh);
-endchar;
-
-beginchar(48, 0, 4.75nhh#, 0); "64th flag down";
- ccccflag(-1);
- shift_pic (0,-.25nhh);
-endchar;
-
-beginchar(49, 0, 5.5nhh#, 0); "128th flag down";
- cccccflag(-1);
- shift_pic (0,-.25nhh);
-endchar;
-
-%%%%%%%
-message("<accidentals>");
-%%%%%%%
-
-def flat (expr reduction, shiftx, flatsense) =
- fthick:= reduction*thick;
- penpos4(4/3fthick,0); % 1
- penpos3(1/2fthick,-90); %
- penpos6(4/7fthick,90); % 6
- x1 = x2 = x3 = x5 = fthick; % / \
- y1 = 6fthick; y2 = .5y4; % 2 4
- y3l=-2fthick; y5 = y3r; % /
- x4 = 3.6fthick; y4 = .1fthick; % 3,5
- y6r= 2fthick; x6 = .5(x2+x4);
- t:= identity shifted (round(shiftx),0);
- p:= (z1--z5) transformed t;
- pickup penrazor scaled max(1,(2sind40*thin)) rotated 40;
- draw p;
- penstroke (z2..{right}z6e..z4e{sw+down}..{sw}z3e) transformed t;
- if flatsense<0: mirror (z5 transformed t, z1 transformed t); fi
- penlabels (1,2,3,4,5,6)
-enddef;
-
-beginchar(50, nhw#, 1.5nhh#, .5nhh#); "flat";
- flat (1, 0, 1);
- savepic;
-endchar;
-
-beginchar(51, 1.7nhw#, 1.5nhh#, .5nhh#); "doubleflat";
- call_add_shift (.7nhw, 0);
-endchar;
-
-def sharp (expr reduction, zshift) =
- sthick:= .5reduction*thick;
- nx:= reduction*1.5nhh;
- ny:= reduction*.8nhw;
- y1 =-y7= nx-1.5sthick; y2 =-y8 = .5sthick-nx;
- x1 = x2 = y3 = -y6 = ny-x7 = ny-x8 = 2sthick;
- y4 =-y5 = y3 + 3sthick;
- x3 = x5 = 0; x4 = x6 = ny;
- pickup penrazor scaled max(1,thin) rotated angle(z4-z3);
- draw z1--z2; draw z8--z7;
- pickup penrazor scaled 3sthick rotated 90;
- draw z3--z4; draw z5--z6;
- shift_pic (zshift, 0);
- labels (range 1 thru 8)
-enddef;
-
-beginchar(52, nhw#, 1.5nhh#, 1.5nhh#); "sharp";
- sharp (1, 0);
-endchar;
-
-beginchar(53, nhw#, .5nhh#, .5nhh#); "doublesharp";
- doublesharp (w, -.1nhw);
-endchar;
-
-def natural (expr reduction, zshift) =
- ny:= .8nhw*reduction;
- nthick:= 3/4reduction*thick;
- x1 = x2 = x3 = nthick+.5thin;
- x5 = x6 = x4 = ny-x1;
- y1 = -y6 = 1.5nhh*reduction;
- y2 = -y5 = 1.6nthick;
- y4 = -y3 = y2+4/3nthick;
- pickup penrazor scaled max(1,thin) rotated angle(z4-z2);
- draw lft z1--bot lft(x3,y3-nthick);
- draw top rt(x4,y4+nthick)--rt z6;
- pickup penrazor scaled 2nthick rotated 90;
- draw (x2-.5,y2)--(x4+.5,y4);
- draw (x3-.5,y3)--(x5+.5,y5);
- shift_pic (zshift, 0);
- labels(1,2,3,4,5,6)
-enddef;
-
-beginchar(54, nhw#, 1.5nhh#, 1.5nhh#); "natural";
- natural (1, 0);
-endchar;
-
-beginchar(90, apog_nhw#, nhh#, .5nhh#); "small flat";
- flat (apog_fact, -.05nhw, 1);
- savepic;
-endchar;
-
-beginchar(91, 1.65apog_nhw#, nhh#, .5nhh#); "small doubleflat";
- call_add_shift (.7apog_fact*nhw,0);
-endchar;
-
-beginchar(92, apog_nhw#, nhh#, nhh#); "small sharp";
- sharp (apog_fact, 0);
-endchar;
-
-beginchar(93, apog_nhw#, .5nhh#, .5nhh#); "small doublesharp";
- doublesharp (w, -.075nhw);
-endchar;
-
-beginchar(94, apog_nhw#, nhh#, nhh#); "small natural";
- natural (apog_fact, 0);
-endchar;
-
-%%%%%%%
-message ("<rests>");
-%%%%%%%
-
-beginchar(59, .5nhw#, 0, 0); "ddp";% doubledouble (4) pause
- fill_square (.5nhw, 2nhh, (0, nhh));
-endchar;
-
-beginchar(58, .5nhw#, 0, 0); "dp";% double (2) pause
- fill_square (.5nhw, nhh, (0, 2nhh));
- savepic;
-endchar;
-
-beginchar(60, 5/4nhw#, .5nhh#, 0); "half rest";
- fill_square (5/4nhw, .5nhh, (0, 0));
- savepic;
-endchar;
-
-beginchar(10, 0, .5nhh#, 0); "half rest outside a staff";
- callpic;
- fill_square (2nhw, lthick, (-.375nhw, -hlthick));
- savepic;
-endchar;
-
-beginchar(11, 0, 0, .5nhh#); "full rest outside a staff";
- call_mirror(origin,right);
-endchar;
-
-beginchar(61, 5/4nhw#, 0, .5nhh#); "full rest";
- fill_square (5/4nhw, .5nhh, (0, -.5nhh));
-endchar;
-
-beginchar(62, 0, 4nhh#, 0); "quarter rest";
- rthin:= 1/8 nhh; % .1
- rthick:= 2 thick+rthin; % .2
- alpha:= -50; % .3
- penpos1(rthin, 90+alpha); % .4
- penpos5(rthin, alpha); % .5,10
- penpos2(rthick, alpha); % .6
- penpos4(rthick, alpha); %
- penpos3(3/4rthick, alpha); % .7
- penpos6(4/3thick, alpha);
- penpos7(rthin, 45);
- y1l = 4nhh - 1/2nhh;
- x1l = 1/2nhh;
- z2r = z1 +(nhh* right) rotated alpha;
- z3 = 1/2[z2,z4];
- z4 = (nhw,4nhh) scaled .55;
- z5 = z4l+(nhh* right) rotated alpha;
- x6l = x4l; y6r = 1.45nhh;
- x7 = .9nhw; y7= nhh-1/8nhh;
- z10 = z5r shifted (sqrt(2)*rthin/4,sqrt(2)*rthin/4);
-
- pickup penrazor scaled rthin rotated 45;
- draw z1--z2r; draw z4l--z10;
- penstroke z2e..z3e..z4e;
- penstroke z5e..z6e..z7e;
- penlabels(1,2,3,4,5,6,7,10);
- shift_pic (-.2nhw, 0);
-endchar;
-
-%%%
-% Draw the crook needed for quaver rests and shorter.
-% The crook extends left from the point z.i on the stem.
-%%%
-def crook(text i)=
- forsuffixes $=i:
- x3:=x.$-6.5fact; y3:=top y.$- 3fact;
- x4:=x.$-6fact; y4:= y.$+.5fact;
- draw z.${dir 240}..{dir 160}z3;
- filldraw z3{dir 160}..z4{dir-20}..{dir 160}z3..cycle;
- endfor
-enddef;
-
-beginchar(63, 0, 3.25nhh#, 0); "8th rest";
- z1=(nhh,nhh);
- z2-z1=whatever*dir 70; % Angle the stem at 70 degrees.
-%%%
-% Define the scaling factor `fact' implicitly.
-% This value will be used for the shorter rests as well.
-%%%
- z2-z1=(5fact,1.7nhh);
- pickup med_pen;
- draw z1..z2;
- crook(2);
- shift_pic (-.35nhw, 0);
- penlabels (1,2,3,4);
-endchar;
-
-beginchar(64, 0, 3.25nhh#, 0); "16th rest";
- z1=(nhh,0);
- z2-z1=whatever*dir 75; % Angle the stem at 75 degrees.
- y2-y1=2.7nhh;
- z5-z2=whatever*(z1-z2); y5=y2-nhh;
- pickup med_pen;
- draw z1..z2;
- crook(2,5);
- shift_pic (-.35nhw, 0);
- penlabels (1,2,3,4,5);
-endchar;
-
-beginchar(65, 0, 4nhh#, 0); "32th rest";
- z1=(nhh,0);
- z2-z1=whatever*dir 80; % Angle the stem at 80 degrees.
- y2-y1=3.7nhh;
- z5-z2=whatever*(z1-z2); y5=y2-nhh;
- z6-z2=whatever*(z1-z2); y6=y5-nhh;
- pickup med_pen;
- draw z1..z2;
- crook(2,5,6);
- shift_pic (-.35nhw, 0);
- penlabels (1,2,3,4,5,6);
-endchar;
-
-beginchar(66, 0, 4.75nhh#, 0); "64th rest";
- z1=(nhh,0);
- z2-z1=whatever*dir 82; % Angle the stem at 82 degrees.
- y2-y1=4.7nhh;
- z5-z2=whatever*(z1-z2); y5=y2-nhh;
- z6-z2=whatever*(z1-z2); y6=y5-nhh;
- z7-z2=whatever*(z1-z2); y7=y6-nhh;
- pickup med_pen;
- draw z1..z2;
- crook(2,5,6,7);
- shift_pic (-.35nhw, 0);
- penlabels (1,2,3,4,5,6,7);
-endchar;
-
-%%%%%%%
-message ("<clefs>");
-%%%%%%%
-
-def violin(expr reduction) =
- gx:=reduction*-nhw;
- gy:=reduction*nhh;
- gthick:=1.5reduction*thick;
- gthin:=.75reduction*med;
-
- x1=31/24gx+w; x4=23/24gx+w; x2=x10=3/4gx+w; x3r=w; x8l=15/16gx+w;
- x5=x11r=15/8gx+w; x6=gx+w; x7=5/8gx+w; x9=5/4gx+w;
- y1=5/8gy; y2r=y5r=2gy; y3=gy; y4r=0; y6=27/8gy;
- y7l=5gy; y8l=11/2gy; y9=17/4gy; y10=y11=-7/8gy;
- penpos1(gthin,160);
- penpos2(gthick,90);
- penpos3(gthick,0);
- penpos4(5/4gthin,-90);
- penpos5(3/2gthick,110);
- penpos6(17/16gthick,130);
- penpos7(gthin,-140);
- penpos8(5/4gthick,-80);
- penpos9(3/8gthick,0);
- penpos10(gthin,0);
- penpos11(1/2gthick,180);
- penstroke z1e{nw}..z2e..z3e..z4e..z5e{up+ne}..z6e..{up+nw}z7e
- ..z8e{sw}..{down}z9e{down}..{down}z10e..z11e;
-%{{{
- currentpen:= pencircle;
- draw z1{nw}..z2..z3..z4..z5{up+ne}..z6..{up+nw}z7
- ..z8{sw}..{down}z9{down}..{down}z10..z11;
-%}}}
- fill_circle ((3(x2-x4)), (x11+11/40gy, y11));
- penlabels(range 1 thru 11)
-enddef;
-
-%beginchar(71, 8/3nhw#, 5.5nhh#, 1.5nhh#); "G-clef";
-beginchar(71, 8/3nhw#, 4.5nhh#, 2.5nhh#); "G-clef";
- violin(1);
-% shift_pic (-.2nhw, 0); % T.59
- shift_pic (-.2nhw, -nhh); % T.60
-endchar;
-
-%beginchar(72, 7/3nhw#, 3nhh#, 2nhh#); "small G-clef";
-beginchar(72, 7/3nhw#, 3nhh#, 3nhh#); "small G-clef";
- violin(.8);
-% shift_pic (-.3nhw, 0); %T.59
- shift_pic (-.3nhw, -nhh); %T.60
-endchar;
-
-def bass (expr reduction) =
- fx:=reduction*nhw;
- fy:=reduction*nhh;
- fthick:=reduction*thick;
-
- x2=.8fx; y2=3nhh;
- x1=x2r+.26fx; y1=y2;
- x3=x2+.71fx; y3r=y2+1fy;
- x4=x3+.71fx; y4=y2-.2fy;
- x6=x2-6reduction*thinwidth; y6=y2-2.2fy;
- x7=x4+.50fx; y7=y2+.38fy;
-
- penpos2(.6fthick,180);
- penpos3(.6fthick, 90);
- penpos4(2fthick,0);
- penpos6(.4fthick,-10);
-
- fill_circle (.35fx, z7);
- add_mirror ((0,y2), (1,y2));
- fill_circle ((2(x2r-x1)), z1);
-
- penstroke z2e{up}..{right}z3e{right}..{down}z4e{down}..{left+.1down}z6e;
-%{{{
- currentpen:= pencircle;
- draw z2{up}..{right}z3{right}..{down}z4{down}..{left+.1down}z6;
-%}}}
- penlabels(1,2,3,4,6)
-enddef;
-
-beginchar(73, 8/3nhw#, 4nhh#, 0); "F-clef";
- bass(1);
-% shift_pic (-.35nhw, 0); % T.59
- shift_pic (-.35nhw, -3nhh); % T.60
-endchar;
-
-beginchar(74, 7/3nhw#, 4nhh#, 0); "small F-clef";
- bass(.8);
-% shift_pic (-4/15nhw, 0); % T.59
- shift_pic (-4/15nhw, -3nhh); % T.59
-endchar;
-
-def alt(expr reduction, yshift) =
- nh:=h*reduction;
- athick:=1/10nh;
- ahigh:=1/2nh;
- radius:=5/4thick*reduction;
-
- x4=13/16nh+3thinwidth; x5=9/16nh;
- x6=1/2nh; x9=x10=2/3nh; x11=17/32nh;
- y4=yshift+31/50ahigh; y5=yshift+1/2ahigh;
- y6=yshift; y9=yshift+1/9ahigh;
- y10=yshift+ahigh; y11=yshift+11/14ahigh;
- penpos4(athick,180);
- penpos5(1/8athick,0);
- penpos6(athick,0);
- penpos9(1/3athick,90);
- penpos10(1/3athick,-90);
- penpos11(1/2athick,0);
-
- penstroke z5e..{sw+down}z6e;
- penstroke z5e{se+3down}..{right}z9e{right}..{up}z4e{up}
- ..{left}z10e{left}..{sw+3down}z11e;
- fill_circle (2radius, (z11l+(radius, -.05nhh)));
- fill_square (athick, ahigh, (5/16nh-1/2athick,yshift));
- fill_square (.25athick, ahigh, (x6l-.25athick,yshift));
- add_mirror ((0,yshift),(1,yshift));
- penlabels(4,5,6,9,10,11)
-enddef;
-
-beginchar(75, 8/3nhw#, 4nhh#, 0); "Alto clef";
- alt(1, 2nhh);
-% shift_pic (-.45nhw, 0); % T.59
- shift_pic (-.45nhw, -2nhh); % T.60
-endchar;
-
-beginchar(76, 7/3nhw#, 4nhh#, 0); "small Alto clef";
- alt(.8 ,2nhh);
-% shift_pic (-.3nhw, 0); % T.59
- shift_pic (-.3nhw, -2nhh); % T.60
-endchar;
-
-beginchar(77, 8/3nhw#, 4nhh#, 0); "drum clef";
- fill_square (.3nhw, .5h, (.85nhw,1nhh));
- add_mirror ((w/2,0),(w/2,1));
-% shift_pic (.2nhw, 0); % T.59
- shift_pic (.2nhw, -2nhh); % T.60
-endchar;
-
-beginchar(103, 8/3nhw#, 4nhh#, nhh#); "oldstyle G-clef";
- def penslopeI= (.35nhh/cosd45)+blacker,45 enddef;
- def penslopeII= (.35nhh/cosd32.5)+blacker,32.5 enddef;
- def penslopeIII= (.4nhh/cosd32.5)+blacker,32.5 enddef;
- def penslopeIV= (max(1,lthick/cosd32.5)),122.5 enddef;
-
- x1l=1.5nhw; x2l=x3l=x4r=x1l+2/5nhw;
- x1l-x5l=x3r-x1l; x6l=x15r=x5l; x7r=x1=x14r; x8=x2;
- y1l=y2l=1.45nhh; y3l=y4r;
- y4l=0; y5=y3r; y6l=y15r; y7l=y8r=3nhh; y14r=y7r;
- z15r-z14r=whatever*dir(180+32.5);
- penpos1(penslopeI);
- penpos2(penslopeI); % /7\ 6(15)
- penpos3(penslopeII); % 6 8 7(14)
- penpos4(penslopeIII); % |
- penpos5(penslopeII); % | 1-2
- penpos6(penslopeII); % | |
- penpos7(penslopeII); % 5 3
- penpos8(.35nhh,90); % \4/
- penpos14(penslopeIV);
- penpos15(penslopeIV);
- penstroke z1e--z2e--z3e;
- fill unitsquare xscaled (x3r-x4l) yscaled lthick
- shifted z4l rotatedaround (z4l,32.5);
- penstroke z4e--z5e{dir85}..z6e;
- penstroke z7e--z8e; penstroke z14e--z15e;
-
- x9=x5l=x16-.25nhw; x10l=x1l; x11=x10-.1nhw; x12=x8;
- x17l=x2r+.05nhw; x13r=x2l-.1nhw;
- y9r=-nhh; y16l=y9l-.01nhh; y10=0;
- y11=3.5nhh; y12r=y8r; y17r=y8r+.2nhh; y13r=4nhh;
- % 13
- penpos12(2lthick,90); % / \
- penpos17(3hlthick,180); % 11 17
- penpos13(.35nhh+blacker,-90); % | 12
- penpos11(max(lthick,1),0); % |
- penpos10(max(lthick,1),0); % 10
- penpos16(.475nhh+blacker,-90); % /
- penpos9(.5nhh+blacker,-90); % 9-16
-
- penstroke z12e..z17e{dir80}..z13e..{down}z11e..{down}z10e{down}..
- {left}z16e..z9e;
- shift_pic (-.25nhw,0);
- penlabels (range 1 thru 12);
- shift_pic (0, -nhh); % T.60
-endchar;
-
-beginchar(98, 8/3nhw#, 3.25nhh#, 0); "gregorian C clef";
- x1=x4=0; x2=x3=gregwidth; y1=y2=-y3=-y4=.5gregwidth-lthick;
- fill z1{dir 15}..z2--z3{dir 165}..z4--cycle;
- save_elempic;
- pickup med_pen; draw bot rt z1..{down}(-.01nhw,-.5nhh);
- shift_pic(nhw,2.5nhh);
- add_mirror ((0,2nhh),(1,2nhh));
- savepic;
- shift_pic (0,-2nhh);
-endchar;
-
-beginchar(122, 8/3nhw#, 4.25nhh#, 0); "gregorian F clef";
- callpic;
- add_elempic (.1nhw,2nhh);
- fill_square (med, 1.5nhh, (.75nhw,.8nhh));
- shift_pic (1/3nhw,-2nhh);
-endchar;
-
-%%%%%%%
-message ("<special signs>");
-%%%%%%%
-
-beginchar(14, 0, nhh#, 0); "song system limit up";
- x1=y1=0; x2=1.5nhw; y2=nhh;
- penpos1(thick, 90); penpos2(thin, 90);
- penstroke z1e{right}..{dir80}z2e;
-%{{{
- currentpen:=pencircle; draw z1{right}..{dir80}z2;
-%}}}
- savepic;
-endchar;
-
-beginchar(15, 0, 0, nhh#); "song system limit down";
- call_mirror (origin, right);
-endchar;
-
-beginchar(16, 0, 0, 0); "used for volta";
- fill_square (lthick, 2.5nhh, (0,-.5nhh));
-endchar;
-
-beginchar(17, 0, 0, 0); "used for volta";
- fill_square (lthick, 2.5nhh, (0,-2.5nhh));
-endchar;
-
-% 'polyrhythmik' {\meterfrac{3+2+3}8}, e.g. Bart\'ok
-beginchar(57, 2nhh#, 1.5nhh#, 0); "big plus sign";
- pickup pencircle scaled .3nhh;
- draw lft(.5nhh,.9nhh)..rt(1.5nhh,.9nhh);
- draw bot(nhh,.4nhh)..top(nhh,1.4nhh);
-endchar;
-
-beginchar(79, 0, 4nhh#, 0); "caesura";% other breathmark
- pickup penrazor scaled thick;
- draw (.3nhw+thick, 3.4nhh)--(.7nhw+thick, 4.6nhh);
-endchar;
-
-beginchar(80, 0, 2.25nhh#, 0); "fermata up";
- x1 = -.5nhw; x2=.5(x1+x3); x3 = 1.5nhw;
- y1 = y3 = nhh; y2 = 2.3nhh;
- penpos1(thinwidth,165);
- penpos2(.9beamht+thin,90);
- penpos3(thinwidth,15);
- penstroke z1e{dir75}..z2e..{dir-75}z3e;
- fill_circle (beamht, (x2, y1+.5beamht));
-%{{{
- currentpen:= pencircle; draw z1{dir 75}..z2..{dir-75}z3;
- add_mirror ((x2, 0),(x2, 1));
-%}}}
- savepic;
- penlabels(1,2,3);
-endchar;
-
-beginchar(81, 0, 0, 2.25nhh#); "fermata down";
- call_mirror (origin, right);
-endchar;
-
-beginchar(82, 5/3nhw#, 4nhh#, 0); "allabreve";
- fit:= .025nhw;
- 2x2 = 2x4 = x1 + 1/2nhh = w;
- x3r = 0; 2y1 = 3y2 = y4r = 3nhh;
- y3r = 2nhh; x5 = w -1/2nhh; y5 = 3nhh -1/2nhh;
- z6r = z5r + (-1/40nhh, 1/20nhh);
- penpos1(max(1,med), 0);
- penpos2(max(1,med), -90);
- penpos3(1/4nhh+thick,180);
- penpos4(max(1,med), 90);
- penpos5(max(1,med), 0);
- penpos6(1/4nhh+med,45);
- penstroke z1e..z2e..z3e..z4e..z5e;
- fill rt z1r..lft z1l..cycle;
- fill_circle (.35nhw+blacker, (z6 + (-2fit, fit)));
- shift_pic (.5nhh,0);
- savepic;
-
- pickup med_pen;
- draw (4/5nhw+.5nhh, y2r-3/8nhh)--(4/5nhw+.5nhh, y4r+3/8nhh);
- penlabels(1,2,3,4,5,6);
- save_elempic;
- shift_pic (0,-2nhh);
-endchar;
-
-beginchar(83, 5/3nhw#, 3.25nhh#, 0); "C";
- callpic;
- shift_pic (0,-2nhh);
-endchar;
-
-beginchar(84, 10/3nhw#, 3.25nhh#, 0); "reverseC";
- callpic;
- add_mirror ((11/6nhw,0),(11/6nhw,1));
- shift_pic (0,-2nhh);
-endchar;
-
-beginchar(123, 5/3nhw#, 3.25nhh#, 0); "reverseallabreve";
- add_elempic (0,0);
- mirror ((13/12nhw,0),(13/12nhw,1));
- shift_pic (0,-2nhh);
-endchar;
-
-beginchar(121, 0, 0, 0); "double thumb bracket";
- mh:=0.625nhh;
- fill_square (lthick, mh, origin);
- fill_square (.55nhw, lthick, origin);
- add_mirror ((0,mh),(1,mh));
- shift_pic (-.75nhw, -mh);
-endchar;
-
-%%%%%%%
-message ("<repeat symbols>");
-%%%%%%%
-
-beginchar(55, 0, 4nhh#, 0); "repeat colons";
- fill_circle (1/3nhw+blacker, (0, 3/2nhh));
- add_mirror ((0, 2nhh),(1, 2nhh));
- shift_pic(0,-2nhh);
-endchar;
-
-beginchar(78, 0, 4nhh#, 0); "due volte";
- fill_circle ((1/3nhw+blacker),(-.75nhh,2.5nhh));
- addto currentpicture also currentpicture rotatedaround ((0,2nhh), 180);
- pickup penrazor scaled (1/3nhw+blacker);
- draw (-nhh, nhh)--(nhh, 3nhh);
-endchar;
-
-beginchar(85, 0, 3.25nhh#, 0); "coda";
- mh:=3nhh;
- x2 = 2nhw-x4 = 1/6mh; y2 = y4 = 1/2mh;
- x3 = x5 = nhw; y3 = mh-y5 = 5/6mh;
- pickup thin_pen;
- draw (0,mh/2)--(2nhw,mh/2); draw (nhw,0)--(nhw,mh);
- savepic;
- pickup coda_pen;
- draw z2..z3..z4..z5..cycle;
- shift_pic (-nhw, 0);
- labels (1,2,3,4);
-endchar;
-
-beginchar(105, 0, 3.25nhh#, 0); "coda II";
- mh:=3nhh;
- callpic;
- x2 = x5 = 1/6mh; y2 = y3 = 5/6mh;
- x3 = x4 = 2nhw-x2; y4 = y5 = 1/6mh;
- pickup coda_pen;
- draw z2--z3--z4--z5--cycle;
- shift_pic (-nhw, 0);
- labels (1,2,3,4);
-endchar;
-
-beginchar(86, 0, 3.25nhh#, 0); "segno";
- x1= .5nhw; y1 = 1.75nhh; x4=-.5x1; y4=.4nhh;
- x5=.7x1; y5=y6=3.05nhh; x6=x5-x1;
- z1'= (x1+1,y1);
- penpos1'(.5nhh+blacker, 80);
- penpos5(max(1,thin), -110);
- penpos6(max(1,1.2thin), -70);
- fill_circle (.5nhh, (x5-.2nhh,y5l-.13nhh));
- fill_circle (thick+.1nhh, (x4, y4+.9nhh));
- penstroke z1'e{dir170}..{ne}z6e..z5e;
- pickup penrazor scaled max(1,thin);
- draw z4--z1;
- penlabels (1,5,6);
- addto currentpicture also currentpicture rotatedaround (z1, 180);
-endchar;
-
-beginchar(110, 0, 5.5nhh#, 2nhh#); "segno II";
- mw:=2.5nhh;
- gamma:=36.9;
- dist:=1nhh+.75beamht;
- gthick:=beamht+blacker;
-
- x1'=x3'=x7=x16=2x1=2x10=2x13=.5mw; x9=x14=x2; x3r=mw-.2nhh;
- x11=x5; x15=x3; mw-x8=x12=1/3nhh;
- y1'=dist; y3'=y1'-.5dist; y4'+dist=y9-2dist=y2; y10-2dist=y13+dist=y1;
- y11=y5+2dist; y14=y2-dist; y8=y6-.1dist+2dist; y12=y3+.1dist-dist;
- y15=y3-dist; y16r=-d; y7l=3.25nhh+2dist;
- z1-z1'=z1'-z2=whatever*dir-gamma;
- z3-z3'=whatever*dir-gamma; z2-z4=whatever*dir(-90-gamma);
- z2-z4'=whatever*dir-90; z4-z4'=whatever*dir-gamma;
- z5=z3 rotatedaround (z1',180); z6=z4 rotatedaround (z1',180);
-
- penpos1(gthick, gamma); penpos2(gthick, gamma);
- penpos3(max(1,thin),-90+gamma); penpos4(.9gthick,-180+gamma);
- penpos5(max(1,thin),-90+gamma); penpos6(.9gthick,-180+gamma);
- penpos7(.3gthick,-90-gamma); penpos8(.5gthick,-180+gamma);
- penpos9(gthick, gamma); penpos10(gthick, gamma);
- penpos11(.5gthick,-90+gamma); penpos12(.5gthick,-180+gamma);
- penpos13(gthick, gamma); penpos14(gthick, gamma);
- penpos15(.5gthick,-90+gamma); penpos16(.3gthick+1,-90-gamma);
-
- penstroke z6e{dir(180-gamma)}..z5e..z1e---z2e..z3e..{dir(180-gamma)}z4e;
- add_shift (0,2dist);
- add_shift (0,-dist);
- unfill (0,-nhh)--(mw,-nhh)--(mw,-d)--(0,-d)--cycle;
- unfill (0,5nhh)--(mw,5nhh)--(mw,6nhh)--(0,6nhh)--cycle; cullit;
-
- penstroke z9e---z10e..z11e..z7e..z8e;
- penstroke z13e---z14e..z15e..z16e..z12e;
-
- dotthick:=.65nhh+blacker; fit:=.15nhh;
- fill_circle(dotthick,(x8-fit,y8-.5dotthick+fit+.02nhh));
- fill_circle(dotthick,(x12+fit,y12+.5dotthick-fit-.02nhh));
-
- pickup thin_pen;
- draw (3/8mw,1/3nhh)--(3/8mw,4nhh+1/3nhh);
- draw (5/8mw,-1/3nhh)--(5/8mw,4nhh-1/3nhh);
- penlabels (range 1 thru 16);
- shift_pic(-mw,0);
-endchar;
-
-%%%%%%%
-message ("<trills>");
-%%%%%%%
-
-beginchar (67, 0, nhh#, 0); "turn";
- x1=2nhw-x6=.4nhw; y1r=h; y6=h-y1;
- x2r=0; y2=.5h; x5=2nhw-x2; y5=h-y2;
- x3=.44nhw; y3r=0; x4=2nhw-x3; y4=h-y3;
- penpos1(med, 90);
- penpos2(med, 180);
- penpos3(thick,-40);
- penpos4(thick,-40);
- penpos5(med, 180);
- penpos6(med, 90);
- penstroke z1e..{down}z2e{down}..{right}z3e{right}
- ..{right}z4e{right}..{down}z5e{down}..z6e;
- fill_circle ((1/4nhh+thick), (x1,y1r-thick));
- fill_circle ((1/4nhh+thick), (x6,y6l+thick));
- shift_pic (-.5nhw, 0);
- penlabels(1,2,3,4,5,6);
- savepic;
-endchar;
-
-beginchar (68, 0, nhh#, 0); "backturn";
- call_mirror ((.5nhw,0), (.5nhw,1));
-endchar;
-
-def setpar =
- off:= .3nhw; x2=x1+off; x3=x2+off; x4=x3+off;
- y1= y3=.75nhh-y2=.75nhh-y4=.15nhh;
-enddef;
-
-beginchar(87, 0, nhh#, 0); "shake";
- x1=-.15nhw; setpar;
- pickup pensquare xscaled (thick+.15nhh) yscaled med rotated 52;
- draw z1--z2--z3--z4;
- save_elempic;
- add_elempic (2off,0);
- savepic;
-endchar;
-
-beginchar(88, 0, nhh#, 0); "(long or double) shake";
- callpic;
- add_elempic (2*2off,0);
- shift_pic (-.3nhw, 0);
- save_elempic;
-endchar;
-
-beginchar(89, 0, nhh#, 0); "mordent";
- callpic;
- fill_square (med, 1.5nhh, (.5nhw,-.375nhh));
-endchar;
-
-beginchar(119, 0, nhh#, 0); "(long or double) mordent";
- currentpicture:= elem_pic; savepic;
- fill_square (med, 1.5nhh, (.5nhw,-.375nhh));
-endchar;
-
-beginchar(106, 0, 1.5nhh#, 0); "Pince with line";
- callpic;
- pickup med_pen;
- draw (-.55nhw, 0)--(-.55nhw, h);
-endchar;
-
-beginchar(107, 0, 1.5nhh#, 0); "Pince with hook nw";
- callpic;
- x1=-.45nhw; setpar;
- pickup med_pen;
- z5=1.75[z3,z2]-(x3-x1,0); z6=z1 rotatedaround (z5,90);
- draw (z1..z5{z2-z3}..{z3-z2}z6) shifted -(.5thick, .15nhh);
-endchar;
-
-beginchar(108, 0, nhh#, 0); "Pince with hook sw";
- callpic;
- x1=-.45nhw; setpar;
- pickup med_pen;
- z5=1.5[z2,z1]-.75(.5thick,.15nhh); z6=z2 rotatedaround (z5,-90);
- draw (z1..z5{z1-z2}..{z2-z1}z6);
-endchar;
-
-beginchar(109, 0, 1.5nhh#, 0); "Pince with hook ne";
- callpic;
- x1=1.35nhw; setpar;
- pickup med_pen;
- z5=1.5[z1,z2]; z6=z1 rotatedaround (z5,-90);
- draw (z1..z5{z2-z1}..{z1-z2}z6);
-endchar;
-
-beginchar(69, nhw#, .5nhh#, 0); "trille-element";
- x1=-1; y1=y2=y3=.5h; x3=2x2=nhw;
- pickup penrazor scaled 1.5thick rotated 50;
- draw z1{ne}..{se}z2{se}..{ne}z3;
-endchar;
-
-beginchar(70, 0, nhh#, 0); "arpeggio-element";
- x1=x2=x3=.2nhw-1; y1=0; y3=2y2=nhh+1;
- pickup penrazor scaled (thick+.16nhh) rotated 45;
- draw z1{ne}..{nw}z2{nw}..{ne}z3;
- shift_pic (-nhw, 0);
-endchar;
-
-%%%%%%%
-message ("<pedal signs>");
-%%%%%%%
-
-def pedalstar (text rot)=
- x4=-x1=min(.05nhh,0.35pt); y1=y4=0; x3=-x2=.14nhh;
- y3=y2=2y5=2y6=.4nhh; x6=-x5=1.1x4;
- p:=(z1..z5..z2..z3..z6..z4--cycle) shifted (0, .2nhh);
- forsuffixes $=rot: fill p rotated $; endfor
- pickup med_pen;
- draw quartercircle scaled .4nhh;
- add_mirror (origin, up);
- add_mirror (origin, right);
- labels (1,2,3,4);
- shift_pic (.5nhw, .8nhh);
-enddef;
-
-beginchar(33, 0, 1.5nhh#, 0); "pedal (release) star I";
- pedalstar (0,60);
-endchar;
-
-beginchar(104, 0, 1.5nhh#, 0); "pedal star II";
- pedalstar (0,45,90);
-endchar;
-
-beginchar(34, 0, 1.5nhh#, 0); "pedal I";
- mw:= 1.25nhw; mh:=1.7nhh;
-
- x1=.425mw; y1=4/18mh;
- x2=.2mw; y2=4/18mh;
- x3=x1; y3r=0;
- x4=.65mw; y4=.35mh;
- x5=.475mw; y5=.83mh;
- penpos1(.75thin,0); penpos4(.275nhh+thin,60);
- penpos2(.15nhh+thin,135); penpos5(.025nhh+med,0);
- penpos3(.025nhh+med,-90);
-
- penstroke z1e{up}..z2e..z3e..z4e..{up+.5right}z5e;
-
- fill lft z1l{up+ne}..{down+se}rt z1r{down+sw}..{up+nw}cycle;
- fill rt z5l{up+ne}..{down+se}lft z5r{down+sw}..{up+nw}cycle;
-%{{{
- currentpen:= pencircle; draw z1{up}..z2..z3..z4..{up+.5right}z5;
-%}}}
-
- x6=mw-x12; y6=.75mh;
- x7=mw-x11; y7=.65mh;
- x8=.25mw; y8=y10;
- x9=x8+(x10-x8)/2; y9r=mh;
- x10=.8mw; y10=.9mh;
- x11=.88mw; y11=y7;
- x12=.7mw; y12=.7mh;
- penpos6(thin,-80); penpos10(1.2med,90);
- penpos7(.25nhh+thin,-110); penpos11(.25nhh+thin,-70);
- penpos8(med,90); penpos12(thin,-100);
- penpos9(.9med,90);
-
- penstroke z6e..z7e..z8e..z9e..z10e..z11e..z12e;
-%{{{
- currentpen:=pencircle; draw z6..z7..z8..z9..z10..z11..z12;
-%}}}
- penlabels (range 1 thru 12);
- savepic;
- shift_pic (-.125nhw, 0);
-endchar;
-
-beginchar(35, 0, 1.5nhh#, 0); "pedal II";
- callpic; %%% ->P
- mw:=3nhw; mh:=1.7nhh;
- fill_circle (.15mh, (.945mw-.15mh/2, .15mh/2));%%% ->.
-
- x1=.5mw; y1=.9mh;
- x2=.77mw; y2=.58mh;
- x3=.815mw; y3=.2mh;
- x4= x2; y4r=0;
- x5=.63mw; y5=.22mh;
- x6= x2; y6=y2;
- penpos1(.75med,90); penpos4(.025nhh+med,-90);
- penpos2(.1125nhh+med,30); penpos5(.1125nhh+thin,-135);
- penpos3(.05nhh+med,0); penpos6(med,100);
-
- penstroke (z1e{right}..z2e..z3e..z4e..z5e{dir 110}..z6e);%%% ->d
- fill lft z1l{ne}..{nw}rt z1r{sw}..{se}cycle;
-
- x7=x5; y7=y5;
- x8=.55mw; y8r=0;
- x9=x1; y9=.56mh;
- x10=x11+.1mw; y10=y11+.1mh;
- x11=.375mw; y11r=0;
- x12=.28mw; y12=.25mh;
- penpos7(thin,-75); penpos10(1.2thin,-45);
- penpos8(.05nhh+med,-90); penpos11(.225nhh,-100);
- penpos9(.0625nhh+thin,80); penpos12(thin,-125);
-
- penstroke z7e..z8e..z9e & z9e{dir-30}..{dir-150}z10e..z11e;%%% ->e
- penstroke z12e..z11e;
- penlabels (range 1 thru 12);
- shift_pic (-(.125nhw+.25nhw), 0);
-endchar;
-
-%^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-%%%%%%%
-message ("<beam elements>");
-%%%%%%%
-
-pen beam_pen;
-beam_pen:= penrazor scaled beamht rotated 90;
-
-for LOOP=0 upto 9:
- longueur:= 2;
- for loop=0 upto 5:
- beginchar(LOOP*6+loop+128, longueur, 0, 0);
- pickup beam_pen;
- draw origin--(lft w, w*(.05*(LOOP+1)));
- savepic;
- endchar;
-
- beginchar(LOOP*6+loop+64+128, longueur, 0, 0);
- call_mirror (origin,right);
- endchar;
-
- longueur:= 2*longueur;
- endfor
-endfor;
-end
+++ /dev/null
-font_identifier := "music_special_symbols";
-
-% Here are two types of pianobrackets available, they are absolute compatible,
-% so choose this one you prefer (search for '%!!!')
-
-% free pos: 196-255
-
-mode_setup;
-
-font_size 20pt#;
-
-nhh#:=5pt#;
-nhw#:=6pt#;
-
-qqs#=.4pt#; %width of lines
-qqw#=10pt#; %length of horizontal stroke.
-
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth:=0.125pt;
-
-define_pixels(qqw,nhh,nhw);
-define_blacker_pixels(med,thick);
-
-qqs:=ceiling(qqs#*hppp); % the way rule widths are calculated
-
-pair sw;
-sw = down+left;
-
-path p;
-picture save_pic;
-
-pen line_pen;
-line_pen:= pencircle scaled qqs;
-
-%%%%%%%
-message ("<glissandi-elements>");
-%%%%%%%
-
-def glissando (expr theta)=
- x1=-1; y1=0; z2=z1+(.5nhw,0); z3=z1+(nhw+1,0);
- p:= z1{1.25up+right}..{1.25down+right}z2{1.25down+right}..{1.25up+right}z3;
- pickup penrazor scaled (.075nhw+thick) rotated (theta+65);
- draw p rotated theta;
- labels (1,2,3);
-enddef;
-
-for slope=1 upto 8:
-
- beginchar(slope-1, (cosd(10slope))*nhw#,(sind(10slope))*nhw#, 0);
- " glissando element slope "&decimal (10slope)&" degree";
- glissando (10slope);
- save_pic:= currentpicture;
- endchar;
-
- beginchar(8+slope-1, (cosd(10slope))*nhw#, (sind(10slope))*nhw#, 0);
- " glissando element slope "&decimal (-10slope)&" degree";
- currentpicture:= save_pic reflectedabout (origin, right);
- endchar;
-
-endfor;
-
-%%%%%%%
-message ("<guitar chords>");
-%%%%%%%
-
-def tabulatur (expr nd)=
- hwidth:=1/5w;
- x1=x2=y2=y3=0; x3=w; y1=-nd;
- fill unitsquare xscaled (w+2thinwidth) yscaled (med+.2pt)
- shifted(-thinwidth,0);
- pickup pencircle scaled max(1,.2pt+blacker);
- for v=1 upto 5 :
- draw (z2--z3) shifted (0,v*-hwidth);
- endfor;
-
- for v=0 upto 5 :
- draw (z1--z2) shifted (v*hwidth,0);
- endfor;
- labels (1,2,3);
-enddef;
-
-shift:=.15nhh;
-def Circle (expr nh)=
- x1l=.1w; x2=x4=.5w; x3l=.9w;
- y1=y3=.5nh+shift; y2=.1nh+shift; y4=.9nh+shift;
- penpos1(med, 0);
- penpos2(thinwidth,90);
- penpos3(med,180);
- penpos4(thinwidth, 270);
- penstroke z1e..z2e..z3e..z4e..cycle;
- pickup pencircle; draw z1..z2..z3..z4..cycle;
-enddef;
-
-def Cross (expr nh)=
- x1=x3=.2w; x2=x4=.8w;
- y1=y4=.2nh+shift; y2=y3=nh-.2nh+shift;
- pickup pencircle scaled med;
- draw z1--z2; draw z3--z4;
- labels (1,2,3,4);
-enddef;
-
-beginchar(16, 3nhw#, 0, 0);" small grid";
- tabulatur (108/25nhh);
-endchar;
-
-beginchar(17, 3/2nhw#, 0, 0); " small dot";
- fill fullcircle scaled .54nhh shifted (w,-.36nhh);
-endchar;
-
-beginchar(18, 3nhw#, 0, 0); " small bar";
- fill unitsquare xscaled w yscaled .24nhh shifted (0,-.48nhh);
-endchar;
-
-beginchar(19, 3/5nhw#, 0, 0); " small circle";
- Circle (.72nhh);
-endchar;
-
-beginchar(20, 3/5nhw#, 0, 0); " small cross";
- Cross (.72nhh);
-endchar;
-
-% the next seems to be senseless, but it isn't
-
-beginchar(28, 3/5nhw#, 0, 0); " small blank";
-endchar;
-
-%%%%%%%
-message ("<several lines>");
-%%%%%%%
-
-hooklength:=4.5pt;
-
-beginchar(21, 0, 0, 0);" bracket hook up";
- pickup line_pen;
- draw origin--(0, hooklength);
-endchar;
-
-beginchar(22, 0, 0, 0);" bracket hook down";
- pickup line_pen;
- draw origin--(0, -hooklength);
-endchar;
-
-beginchar(23, nhw#, 0, 0);" upper octaveline";
- pickup line_pen;
- draw (.33w, 1.1nhw)--(.66w, 1.1nhw);
-endchar;
-
-beginchar(24, 0, 0, 0);" final hook for upper octaveline";
- pickup line_pen;
- draw (1.1nhw,0)--(1.1nhw, 1.1nhw);
- draw (.33nhw, 1.1nhw)--(1.1nhw, 1.1nhw);
-endchar;
-
-beginchar(25, nhw#, 0, 0);" lower octaveline";
- pickup line_pen;
- draw (.33w, 0)--(.66w, 0);
-endchar;
-
-beginchar(26, 0, 0, 0);" final hook for lower octaveline";
- pickup line_pen;
- draw (1.1nhw,0)--(1.1nhw, 1.1nhw);
- draw (.33nhw,0)--(1.1nhw, 0);
-endchar;
-
-beginchar(27, .75nhw#, 0, 0);" used for \bracket";
- pickup line_pen;
- draw origin--(.5nhw, 0);
-endchar;
-
-beginchar(29, qqw#, 0, 0);" line ydim 0pt";
- pickup line_pen;
- draw origin--(w,0);
-endchar;
-
-% lines length xdim 10pt, ydim (-).25 to (-)5pt
-
-for j=1 upto 20:
- beginchar(29+j, qqw#, 0, 0); " line ydim "&decimal .25j&"pt";
- pickup line_pen;
- draw origin--(w, .25pt*j);
- save_pic:= currentpicture;
- endchar;
-
- beginchar(49+j, qqw#, 0, 0); " line ydim -"&decimal .25j&"pt";
- currentpicture:= save_pic reflectedabout (origin, right);
- endchar;
-endfor;
-
-%%%%%%%
-message ("<circles>");
-%%%%%%%
-
-for n:=1 upto 14:
- beginchar(70+n-1, 0, 0, 0);
- " fullcircle diameter "&decimal ((n+2)*2)&" pt";
- diameter:=(n+2)*2pt;
- pickup line_pen;
- draw fullcircle scaled diameter;
- endchar;
-endfor;
-
-%%%%%%%
-message ("<(de-)crescendi>");
-%%%%%%%
-
-widthstep:=nhw;
-crescendowidth:=.5nhh; % \Internote
-
-for n:=1 upto 32:
- beginchar(84+n-1, 0, 3pt#, 3pt#);
- " crescendo length "&decimal n&" noteheadwidths";
- pickup line_pen;
- draw (n*widthstep, crescendowidth+.0075n*crescendowidth)--(0,0);
- addto currentpicture also currentpicture reflectedabout (origin,right);
- save_pic:= currentpicture;
- endchar;
-
- beginchar(116+n-1, 0, 3pt#, 3pt#);
- " decrescendo length "&decimal n&" noteheadwidths";
- currentpicture:= save_pic reflectedabout(origin, up) shifted (n*widthstep,0);
- endchar;
-endfor;
-
-%%%%%%%
-message ("<piano brackets>");
-%%%%%%%
-
-% lastbrace is adjustable (originally 99)
-
-firstbrace:=20; % smallest brace is 2*20 pt (\simeq 14mm)
-lastbrace:=67; % largest brace is 2*67 pt (\simeq 47mm)
-
-%%% from Stanislav Kneifl
-
-def drawpianobracket (expr height) =
- u# := 1nhh#/5pt# * 1pt#;
- v# := (height/40) * 1pt#;
- define_pixels (u, v);
-% beginchar (height-firstbrace, 1.25nhh#, 0, 0);
- beginchar (height-firstbrace+148, 0, 0, 0);
- z1 = origin;
- z2 = (4.7u, 7v);
- z3 = (3.6u, 16.5v);
- z4 = (1.9u, 25v);
- z5 = (2.28u, 32v);
- z6 = (w, 40v);
- penpos1 (max(1,0.1u), 125);
- penpos2 (1.2u, 180);
- penpos3 (3.2u, 195);
- penpos4 (2.5u, 180);
- penpos5 (1.14u, 180);
- penpos6 (max(2,0.3u), 150);
- penstroke z1e{dir 35}..z2e..z3e..z4e..z5e..{dir 60}z6e;
- currenttransform := identity reflectedabout ((0,0),(1,0));
- penstroke z1e{dir 35}..z2e..z3e..z4e..z5e..{dir 60}z6e;
- currenttransform := identity;
-% inserted
- currentpicture:=currentpicture shifted (round(-1.75nhh), 0);
-%
- endchar;
-enddef;
-
-def bigbrace(expr v) =
- beginchar (v-firstbrace+148, 0, 0, 0);
- " brace vsize "&decimal round(2v*pt#)&"pt";
- vwidth:=v*pt;
- hwidth:=max(.1vwidth,3.25pt);
- hwidth:=min(hwidth,6.5pt);
- actwidth:=.035vwidth;
- x1=.25nhw; y1=vwidth;
- x2l=-.8hwidth; y2=2/3vwidth;
- x3r=.2hwidth; y3=1/3vwidth;
- x4=-hwidth; y4=0;
- penpos1(max(1,.25pt),-35);
- penpos2(1.5med+actwidth,40);
- penpos3(1.75med+actwidth,45);
- penpos4(max(1,.2pt),-90);
- penstroke z1e..z2e..z3e..{left+sw}z4e;
- currentpen:= pencircle; draw z1..z2..z3..{left+sw}z4;
- addto currentpicture also currentpicture reflectedabout (origin, right);
- penlabels(1,2,3,4);
- currentpicture:= currentpicture shifted (round(-.75nhh), 0);
- endchar;
-enddef;
-
-%!!! comment the line 'bigbrace' and uncomment the line 'drawpianobracket'
-
-for v=firstbrace upto lastbrace :
- bigbrace (v);
-% drawpianobracket (v);
-endfor;
-
-end
+++ /dev/null
-font_identifier := "music_special_symbols";
-
-% Here are two types of pianobrackets available, they are absolute compatible,
-% so choose this one you prefer (search for '%!!!')
-
-% free pos: 196-255
-
-mode_setup;
-
-font_size 20pt#;
-
-nhh#:=5pt#;
-nhw#:=6pt#;
-
-qqs#=.4pt#; %width of lines
-qqw#=10pt#; %length of horizontal stroke.
-
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth:=0.125pt;
-
-define_pixels(qqw,nhh,nhw);
-define_blacker_pixels(med,thick);
-
-qqs:=ceiling(qqs#*hppp); % the way rule widths are calculated
-
-pair sw;
-sw = down+left;
-
-path p;
-picture save_pic;
-
-pen line_pen;
-line_pen:= pencircle scaled qqs;
-
-%%%%%%%
-message ("<glissandi-elements>");
-%%%%%%%
-
-def glissando (expr theta)=
- x1=-1; y1=0; z2=z1+(.5nhw,0); z3=z1+(nhw+1,0);
- p:= z1{1.25up+right}..{1.25down+right}z2{1.25down+right}..{1.25up+right}z3;
- pickup penrazor scaled (.075nhw+thick) rotated (theta+65);
- draw p rotated theta;
- labels (1,2,3);
-enddef;
-
-for slope=1 upto 8:
-
- beginchar(slope-1, (cosd(10slope))*nhw#,(sind(10slope))*nhw#, 0);
- " glissando element slope "&decimal (10slope)&" degree";
- glissando (10slope);
- save_pic:= currentpicture;
- endchar;
-
- beginchar(8+slope-1, (cosd(10slope))*nhw#, (sind(10slope))*nhw#, 0);
- " glissando element slope "&decimal (-10slope)&" degree";
- currentpicture:= save_pic reflectedabout (origin, right);
- endchar;
-
-endfor;
-
-%%%%%%%
-message ("<guitar chords>");
-%%%%%%%
-
-def tabulatur (expr nd)=
- hwidth:=1/5w;
- x1=x2=y2=y3=0; x3=w; y1=-nd;
- fill unitsquare xscaled (w+2thinwidth) yscaled (med+.2pt)
- shifted(-thinwidth,0);
- pickup pencircle scaled max(1,.2pt+blacker);
- for v=1 upto 5 :
- draw (z2--z3) shifted (0,v*-hwidth);
- endfor;
-
- for v=0 upto 5 :
- draw (z1--z2) shifted (v*hwidth,0);
- endfor;
- labels (1,2,3);
-enddef;
-
-shift:=.15nhh;
-def Circle (expr nh)=
- x1l=.1w; x2=x4=.5w; x3l=.9w;
- y1=y3=.5nh+shift; y2=.1nh+shift; y4=.9nh+shift;
- penpos1(med, 0);
- penpos2(thinwidth,90);
- penpos3(med,180);
- penpos4(thinwidth, 270);
- penstroke z1e..z2e..z3e..z4e..cycle;
- pickup pencircle; draw z1..z2..z3..z4..cycle;
-enddef;
-
-def Cross (expr nh)=
- x1=x3=.2w; x2=x4=.8w;
- y1=y4=.2nh+shift; y2=y3=nh-.2nh+shift;
- pickup pencircle scaled med;
- draw z1--z2; draw z3--z4;
- labels (1,2,3,4);
-enddef;
-
-beginchar(16, 3nhw#, 0, 0);" small grid";
- tabulatur (108/25nhh);
-endchar;
-
-beginchar(17, 3/2nhw#, 0, 0); " small dot";
- fill fullcircle scaled .54nhh shifted (w,-.36nhh);
-endchar;
-
-beginchar(18, 3nhw#, 0, 0); " small bar";
- fill unitsquare xscaled w yscaled .24nhh shifted (0,-.48nhh);
-endchar;
-
-beginchar(19, 3/5nhw#, 0, 0); " small circle";
- Circle (.72nhh);
-endchar;
-
-beginchar(20, 3/5nhw#, 0, 0); " small cross";
- Cross (.72nhh);
-endchar;
-
-% the next seems to be senseless, but it isn't
-
-beginchar(28, 3/5nhw#, 0, 0); " small blank";
-endchar;
-
-%%%%%%%
-message ("<several lines>");
-%%%%%%%
-
-hooklength:=4.5pt;
-
-beginchar(21, 0, 0, 0);" bracket hook up";
- pickup line_pen;
- draw origin--(0, hooklength);
-endchar;
-
-beginchar(22, 0, 0, 0);" bracket hook down";
- pickup line_pen;
- draw origin--(0, -hooklength);
-endchar;
-
-beginchar(23, nhw#, 0, 0);" upper octaveline";
- pickup line_pen;
- draw (.33w, 1.1nhw)--(.66w, 1.1nhw);
-endchar;
-
-beginchar(24, 0, 0, 0);" final hook for upper octaveline";
- pickup line_pen;
- draw (1.1nhw,0)--(1.1nhw, 1.1nhw);
- draw (.33nhw, 1.1nhw)--(1.1nhw, 1.1nhw);
-endchar;
-
-beginchar(25, nhw#, 0, 0);" lower octaveline";
- pickup line_pen;
- draw (.33w, 0)--(.66w, 0);
-endchar;
-
-beginchar(26, 0, 0, 0);" final hook for lower octaveline";
- pickup line_pen;
- draw (1.1nhw,0)--(1.1nhw, 1.1nhw);
- draw (.33nhw,0)--(1.1nhw, 0);
-endchar;
-
-beginchar(27, .75nhw#, 0, 0);" used for \bracket";
- pickup line_pen;
- draw origin--(.5nhw, 0);
-endchar;
-
-beginchar(29, qqw#, 0, 0);" line ydim 0pt";
- pickup line_pen;
- draw origin--(w,0);
-endchar;
-
-% lines length xdim 10pt, ydim (-).25 to (-)5pt
-
-for j=1 upto 20:
- beginchar(29+j, qqw#, 0, 0); " line ydim "&decimal .25j&"pt";
- pickup line_pen;
- draw origin--(w, .25pt*j);
- save_pic:= currentpicture;
- endchar;
-
- beginchar(49+j, qqw#, 0, 0); " line ydim -"&decimal .25j&"pt";
- currentpicture:= save_pic reflectedabout (origin, right);
- endchar;
-endfor;
-
-%%%%%%%
-message ("<circles>");
-%%%%%%%
-
-for n:=1 upto 14:
- beginchar(70+n-1, 0, 0, 0);
- " fullcircle diameter "&decimal ((n+2)*2)&" pt";
- diameter:=(n+2)*2pt;
- pickup line_pen;
- draw fullcircle scaled diameter;
- endchar;
-endfor;
-
-%%%%%%%
-message ("<(de-)crescendi>");
-%%%%%%%
-
-widthstep:=nhw;
-crescendowidth:=.5nhh; % \Internote
-
-for n:=1 upto 32:
- beginchar(84+n-1, 0, 3pt#, 3pt#);
- " crescendo length "&decimal n&" noteheadwidths";
- pickup line_pen;
- draw (n*widthstep, crescendowidth+.0075n*crescendowidth)--(0,0);
- addto currentpicture also currentpicture reflectedabout (origin,right);
- save_pic:= currentpicture;
- endchar;
-
- beginchar(116+n-1, 0, 3pt#, 3pt#);
- " decrescendo length "&decimal n&" noteheadwidths";
- currentpicture:= save_pic reflectedabout(origin, up) shifted (n*widthstep,0);
- endchar;
-endfor;
-
-%%%%%%%
-message ("<piano brackets>");
-%%%%%%%
-
-% lastbrace is adjustable (originally 99)
-
-firstbrace:=20; % smallest brace is 2*20 pt (\simeq 14mm)
-lastbrace:=67+48; % largest brace is 2*67 pt (\simeq 47mm)
-
-%%% from Stanislav Kneifl
-
-def drawpianobracket (expr height) =
- u# := 1nhh#/5pt# * 1pt#;
- v# := (height/40) * 1pt#;
- define_pixels (u, v);
-% beginchar (height-firstbrace, 1.25nhh#, 0, 0);
- beginchar (height-firstbrace+148, 0, 0, 0);
- z1 = origin;
- z2 = (4.7u, 7v);
- z3 = (3.6u, 16.5v);
- z4 = (1.9u, 25v);
- z5 = (2.28u, 32v);
- z6 = (w, 40v);
- penpos1 (max(1,0.1u), 125);
- penpos2 (1.2u, 180);
- penpos3 (3.2u, 195);
- penpos4 (2.5u, 180);
- penpos5 (1.14u, 180);
- penpos6 (max(2,0.3u), 150);
- penstroke z1e{dir 35}..z2e..z3e..z4e..z5e..{dir 60}z6e;
- currenttransform := identity reflectedabout ((0,0),(1,0));
- penstroke z1e{dir 35}..z2e..z3e..z4e..z5e..{dir 60}z6e;
- currenttransform := identity;
-% inserted
- currentpicture:=currentpicture shifted (round(-1.75nhh), 0);
-%
- endchar;
-enddef;
-
-def bigbrace(expr v) =
- beginchar (v-firstbrace+148, 0, 0, 0);
- " brace vsize "&decimal round(2v*pt#)&"pt";
- vwidth:=v*pt;
- hwidth:=max(.1vwidth,3.25pt);
- hwidth:=min(hwidth,6.5pt);
- actwidth:=.035vwidth;
- x1=.25nhw; y1=vwidth;
- x2l=-.8hwidth; y2=2/3vwidth;
- x3r=.2hwidth; y3=1/3vwidth;
- x4=-hwidth; y4=0;
- penpos1(max(1,.25pt),-35);
- penpos2(1.5med+actwidth,40);
- penpos3(1.75med+actwidth,45);
- penpos4(max(1,.2pt),-90);
- penstroke z1e..z2e..z3e..{left+sw}z4e;
- currentpen:= pencircle; draw z1..z2..z3..{left+sw}z4;
- addto currentpicture also currentpicture reflectedabout (origin, right);
- penlabels(1,2,3,4);
- currentpicture:= currentpicture shifted (round(-.75nhh), 0);
- endchar;
-enddef;
-
-%!!! comment the line 'bigbrace' and uncomment the line 'drawpianobracket'
-
-for v=firstbrace upto lastbrace :
- bigbrace (v);
-% drawpianobracket (v);
-endfor;
-
-end
+++ /dev/null
-%(c)
-
-min_bow:= .5nhh;
-max_bow:= 1.5nhh;
-slope:=17.5/100;
-
-code=-1;
-
-for iht=1 upto 8:
- for iwd=0 upto 15:
- beginchar(incr code, 0, 0, 0);
- mw#:=(minwidth+iwd*delwidth)*pt#;
- define_pixels(mw);
- x1 = y1= 0; x3= mw; y3= 2y2'= iht*delheight; x2'= .5x3;
- mheight:=y3;
- z2-z2'= whatever*dir(angle(z3-z1)+90);
- my_bow:=min(max_bow, slope*mw);
- my_bow:=max(my_bow, min_bow);
- z1'=(z1-(0,my_bow)) rotated angle(z3-z1);
- (z1'-z2)=whatever*(z1-z2');
- penpos1(.15thick,(angle(z3-z1)+90));
- penpos2(thick,(angle(z3-z1)+90));
- penpos3(.15thick,(angle(z3-z1)+90));
- penstroke (flex(z1e,z2e,z3e));
-%{{{
- currentpen:= pencircle;
- draw (flex(z1,z2,z3));% draw z1--z3; draw z2'--z2--z1'--z1;
-%}}}
- currentpicture:=currentpicture t;
- p:=currentpicture;
- endchar;
-
- beginchar(code+128, 0, 0, 0);
- currentpicture:=p T;
- endchar;
-
- endfor
-endfor
-end
+++ /dev/null
-%(c)
-
-min_bow:= .4nhh;
-max_bow:= 1.75nhh;
-slope:= 10/100;
-
-code=-1;
-
-for i=1 upto numslurs:
- beginchar(incr code, 0, 0, 0);
- mw:=(minwidth+code*delwidth)*pt;
- x3= -x1= .5mw; x2= y1= y3 = 0;
- y2= max(min_bow, slope*mw);
- y2:= min(y2, max_bow);
- penpos1(.15thick,90); penpos2(thick,90); penpos3(.15thick,90);
- penstroke (flex(z1e,z2e,z3e));
- currentpen:= pencircle; draw (flex(z1,z2,z3));
- p:=currentpicture;
- endchar;
-
- beginchar(code+54, 0, 0, 0);
- currentpicture:=p reflectedabout (origin, right);
- endchar;
-endfor
-end
+++ /dev/null
-
-font_identifier:="xgreg11";
-
-mode_setup;
-
-font_size 10.24pt#;
-
-nhh#:=2.56pt#;
-
-input xgreggen
+++ /dev/null
-
-font_identifier:="xgreg13";
-
-mode_setup;
-
-font_size 12.8pt#;
-
-nhh#:=3.2pt#;
-
-input xgreggen
+++ /dev/null
-
-font_identifier:="xgreg16";
-
-mode_setup;
-
-font_size 16pt#;
-
-nhh#:=4pt#;
-
-input xgreggen
+++ /dev/null
-
-font_identifier:="xgreg20";
-
-mode_setup;
-
-font_size 20pt#;
-nhh#:=5pt#;
-
-
-input xgreggen
+++ /dev/null
-
-font_identifier:="xgreg24";
-
-mode_setup;
-
-font_size 24pt#;
-
-nhh#:=6pt#;
-
-input xgreggen
+++ /dev/null
-
-font_identifier:="musix25";
-
-mode_setup;
-
-font_size 25pt#;
-
-nhh#:=6.25pt#;
-nhw#:=7.5pt#;
-gregwidth#:=0.5*sqrt(2)*nhw#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.15pt;
-beamht#:=0.48nhh#;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-input musixgen
+++ /dev/null
-
-font_identifier:="xgreg29";
-
-mode_setup;
-
-font_size 29pt#;
-
-nhh#:=7.2pt#;
-
-input xgreggen
+++ /dev/null
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-% this is xgreggen.mf (c)
-%
-% Version T.67 [January 97]
-%
-
-nhw#:=1.2*nhh#;
-
-thin#:=1/50designsize;
-med#:=1/33designsize;
-thick#:=1/16designsize;
-
-thinwidth := 0.125pt;
-beamht#:=0.48nhh#;
-%gregwidth#:=0.5*sqrt(2)*nhh#;
-gregwidth#:=0.6*nhh#;
-smallgreg:=0.5;
-
-define_pixels(nhh,nhw,beamht,gregwidth);
-define_blacker_pixels(thin,med,thick);
-
-pair ne,se,sw,nw; %northeast,southeast,southwest,northwest
-ne = up+right; se = down+right; sw = down+left; nw = up+left;
-
-font_x_height nhh#;
-font_quad nhw#;
-
-pair pone, ptwo;
-transform t;
-path p;
-
-hlthick=.2pt;
-lthick=.4pt;
-
-greglangle:=18; gregrlangle:=180+greglangle;
-greguangle:=26; gregruangle:=180+greguangle;
-orisuangle:=40; orisruangle:=180+orisuangle;
-
-diamwidth:=.96 gregwidth; greg_min_diam:=gregwidth-diamwidth;
-diamheight:=1.33 gregwidth;
-deminutae:=0.66; gregwidth_dem:=gregwidth*deminutae;
-aucta_fact:=0.33gregwidth;
-shave:=.3gregwidth;
-
-pen line_pen, med_pen, coda_pen, thin_pen;
-med_pen:= pencircle scaled med;
-line_pen:= pencircle scaled lthick;
-coda_pen:= pencircle xscaled 1.25thick yscaled max(1,.75med);
-thin_pen:= pencircle scaled max(1,.25pt);
-
-picture save_pic, elem_pic;
-
-%%%%%%%%%%%%%%%
-% basic def's %
-%%%%%%%%%%%%%%%
-
-def savepic = save_pic:= currentpicture enddef;
-def save_elempic = elem_pic:= currentpicture enddef;
-def callpic = currentpicture:= save_pic enddef;
-
-def mirror (expr pone, ptwo) =
- currentpicture:=currentpicture reflectedabout(round(pone),round(ptwo))
-enddef;
-
-def add_mirror (expr pone, ptwo) =
- addto currentpicture also currentpicture
- reflectedabout (round(pone), round(ptwo))
-enddef;
-
-def call_mirror (expr pone, ptwo) = callpic; mirror (pone, ptwo) enddef;
-
-def add_shift (expr pone, ptwo) =
- addto currentpicture also currentpicture shifted (pone, ptwo)
-enddef;
-
-def call_add_shift (expr pone, ptwo) =
- callpic; add_shift (pone, ptwo)
-enddef;
-
-def add_elempic (expr pone, ptwo) =
- addto currentpicture also elem_pic shifted (pone, ptwo)
-enddef;
-
-def call_add_save_elempic (expr pone, ptwo) =
- callpic; add_elempic(pone, ptwo); savepic
-enddef;
-
-def shift_pic (expr pone, ptwo) =
- currentpicture:=currentpicture shifted (round(pone),round(ptwo))
-enddef;
-
-def fill_circle (expr diameter, zshift) =
- fill fullcircle scaled diameter shifted zshift
-enddef;
-
-def fill_square (expr xwidth, ywidth, zshift) =
- fill unitsquare xscaled xwidth yscaled ywidth shifted zshift
-enddef;
-
-%
-
-% eobasicdefs ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-%%%%%%%
-message ("<noteheads>");
-%%%%%%%
-
-NHW=nhw+hlthick;
-
-beginchar(0, gregwidth#, .5nhh#, .5nhh#); "dummy square";
-endchar;
-
-beginchar(18, smallgreg*gregwidth#, .5nhh#, .5nhh#); "small dummy square";
-endchar;
-
-
-beginchar(1, 0, .5nhh#, .5nhh#); "filled diamond";
- x1:=0.5greg_min_diam+hlthick; x3=gregwidth-x1; x2=x4=0.5gregwidth;
- y1=y3=0; y2=-y4=0.5diamheight;
- pickup pencircle scaled lthick;
- fill z1--z2--z3--z4--cycle;
- draw z1--z2--z3--z4--cycle;
- penlabels (1,2,3,4);
-endchar;
-
-beginchar(2, 0, .5nhh#, .5nhh#); "filled diamond aucta";
- x1:=0.5greg_min_diam+hlthick; x3=gregwidth-x1; x2=x4=0.5gregwidth;
- y1=y3=0; y2=-y4=0.5diamheight;
- x5=x1+hlthick; y5=1.5y4;
- pickup pencircle scaled lthick;
- fill z1--z2--z3{sw+down}..{left+0.3up}z5--z5{right}..z4--cycle;
- draw z1--z2--z3{sw+down}..{left+0.3up}z5--z5{right}..z4--cycle;
- penlabels (1,2,3,4,5);
-endchar;
-
-beginchar(3, 0, .5nhh#, .5nhh#); "apostropha";
- x1:=0.5greg_min_diam+hlthick; x3=gregwidth-x1; x2=x4+0.1gregwidth=0.5gregwidth;
- y1=y3=0; y2=0.5gregwidth+0.5greg_min_diam-hlthick;
- y4=-y2-0.2gregwidth;
- pickup pencircle scaled lthick;
- fill z1--z2--z3{left+1.5down}..{left+0.6down}z4--z4{right+2up}..{left+0.1up}cycle;
- draw z1--z2--z3{left+1.5down}..{left+0.6down}z4--z4{right+2up}..{left+0.1up}cycle;
- penlabels (1,2,3,4);
-endchar;
-
-beginchar(4, 0, .5nhh#, .5nhh#); "filled diamond deminutae";
- x1:=0.5greg_min_diam*deminutae+hlthick;
- x3=gregwidth_dem-x1; x2=x4=0.5gregwidth_dem;
- y1=y3=0; y2=-y4=0.5diamheight*deminutae;
- pickup pencircle scaled lthick;
- fill z1--z2--z3--z4--cycle;
- draw z1--z2--z3--z4--cycle;
- penlabels (1,2,3,4);
-endchar;
-
-beginchar(5, 0, .5nhh#, .5nhh#); "gregorian punctum";
- x1=x4=hlthick; x2=x3=gregwidth+hlthick; y1=y2=-y3=-y4=.5gregwidth-hlthick;
- pickup pencircle scaled lthick;
- fill z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- draw z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- shift_pic(0,-hlthick);
- savepic;
- penlabels (1,2,3,4);
-endchar;
-
-beginchar(13, 0, .5nhh#, .5nhh#); "mirrored gregorian punctum";
- callpic;
- mirror(origin, right);
-endchar;
-
-beginchar(6, 0, .5nhh#, .5nhh#); "gregorian virga left";
- callpic;
- fill_square (lthick, 1.5nhh,(0, -1.5nhh));
-endchar;
-
-beginchar(7, 0, .5nhh#, .5nhh#); "gregorian virga right";
- callpic;
- fill_square (lthick, 1.5nhh,(gregwidth, -1.5nhh));
-endchar;
-
-beginchar(8, 0, .5nhh#, .5nhh#); "gregorian punctum aucta down";
- x1=x4=hlthick; x2=x3=gregwidth+hlthick;
- y1=y2+aucta_fact=-y3-aucta_fact=-y4=.5gregwidth-hlthick;
- pickup pencircle scaled lthick;
- fill z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- draw z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- shift_pic(0,-hlthick);
- savepic;
- penlabels (1,2,3,4);
-endchar;
-
-beginchar(9, 0, .5nhh#, .5nhh#); "gregorian punctum aucta up";
-callpic;
-mirror(origin,right);
-endchar;
-
-beginchar(10, 0, .5nhh#, .5nhh#); "oriscus";
- x1=x4=hlthick; x2=x3=gregwidth+hlthick; y1=y2=-y3=-y4=.5gregwidth-hlthick;
- pickup pencircle scaled lthick;
- fill z1{dir orisuangle}..{dir orisuangle}z2--z3{dir orisruangle}..{dir orisruangle}z4--cycle;
- draw z1{dir orisuangle}..{dir orisuangle}z2--z3{dir orisruangle}..{dir orisruangle}z4--cycle;
- penlabels (1,2,3,4);
-endchar;
-
-beginchar(11, 0, .5nhh#, .5nhh#); "apostropha aucta";
- x1:=0.5greg_min_diam+hlthick; x3=gregwidth-x1; x2=x4=0.5gregwidth;
- y1=y3=0; y2=0.5gregwidth+0.5greg_min_diam-hlthick;
- y4=-y2-0.2gregwidth; y5=y4; x5=x1;
- pickup pencircle scaled lthick;
- fill z1--z2--z3{left+1.5down}..{left+0.6down}z4..z5--z5{right}..{left+0.1up}cycle;
- draw z1--z2--z3{left+1.5down}..{left+0.6down}z4..z5--z5{right}..{left+0.1up}cycle;
- penlabels (1,2,3,4,5);
-endchar;
-
-beginchar(12, 0, .5nhh#, .5nhh#); "small gregorian punctum";
- x1=x4=hlthick; x2=x3=smallgreg*gregwidth+hlthick;
- y1=y2=-y3=-y4=.5smallgreg*gregwidth-hlthick;
- pickup pencircle scaled lthick;
- fill z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- draw z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- shift_pic(0,-hlthick);
- savepic;
-endchar;
-
-beginchar(14, 0, .5nhh#, .5nhh#); "mirrored small gregorian punctum";
- callpic;
- mirror(origin, right);
-endchar;
-
-beginchar(15, gregwidth#, .5nhh#, .5nhh#); "podatus bottom";
- fill_square(gregwidth+lthick, gregwidth, (0, -0.5gregwidth));
-endchar;
-
-beginchar(16, gregwidth#, .5nhh#, .5nhh#); "small podatus bottom";
- fill_square(gregwidth+lthick, gregwidth-shave, (0, -0.5gregwidth));
-endchar;
-
-beginchar(17, 0, .5nhh#, .5nhh#); "gregorian punctum shaved bottom";
- x1=x4=hlthick; x2=x3=gregwidth+hlthick; y1=y2=-y3+shave=-y4+shave=.5gregwidth-hlthick;
- pickup pencircle scaled lthick;
- fill z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- draw z1{dir greguangle}..z2--z3..{dir gregrlangle}z4--cycle;
- shift_pic(0,-hlthick);
- savepic;
- penlabels (1,2,3,4);
-endchar;
-
-def square (expr mw)=
- fill_square (sqrt(2)*.5mw, max(1,thin), origin) rotated -45;
- fill_square (sqrt(2)*.5mw, .15nhw, (0,-.15nhw)) rotated 45;
- save_elempic;
- mirror (origin,up);
- mirror (origin,left);
- shift_pic (mw+.5,0);
- add_elempic(0,0);
-% mirror (origin,right);% I've seen this too, somewhere ...
-enddef;
-
-beginchar(118, 0, .5nhh#, .5nhh#); "deep porrectus";
- x1=x4=0; x2=x3=3*gregwidth+lthick;
- y1=-y4=.5gregwidth-lthick; y2=y1-2nhh; y3=y4-2nhh;
- z5=z1+(0,0.3gregwidth);
- fill z5..{right+0.4down}z2--z3{left+0.4up}..z4--cycle; shift_pic(0,hlthick);
- fill_square (med, 1.5nhh,(0, -2nhh));
- penlabels (1,2,3,4,5);
-endchar;
-
-beginchar(119, 0, .5nhh#, .5nhh#); "low porrectus";
- x1=x4=0; x2=x3=3*gregwidth+lthick;
- y1=-y4=.5gregwidth-lthick; y2=y1-1.5nhh; y3=y4-1.5nhh;
- z5=z1+(0,0.2gregwidth);
- fill z1..{right+0.4down}z2--z3{left+0.4up}..z4--cycle; shift_pic(0,hlthick);
- fill_square (med, 1.5nhh,(0, -2nhh));
- penlabels (1,2,3,4,5);
-endchar;
-
-beginchar(120, 0, .5nhh#, .5nhh#); "porrectus";
- x1=x4=0; x2=x3=3*gregwidth+lthick;
- y1=-y4=.5gregwidth-lthick; y2=y1-nhh; y3=y4-nhh;
- z5=z1+(0,0.1gregwidth);
- fill z5..{right}z2--z3{left}..z4--cycle; shift_pic(0,hlthick);
- fill_square (med, 1.5nhh,(0, -1.5nhh));
- penlabels (1,2,3,4,5);
-endchar;
-
-beginchar(121, 0, .5nhh#, .5nhh#); "soft porrectus";
- x1=x4=0; x2=x3=3*gregwidth+lthick;
- y1=-y4=.5gregwidth-lthick; y2=y1-0.5nhh; y3=y4-0.5nhh;
- z5=z1+(0,0.1gregwidth);
- fill z5..{right}z2--z3{left}..z4--cycle; shift_pic(0,hlthick);
- fill_square (med, 1.5nhh,(0, -1.5nhh));
- penlabels (1,2,3,4,5);
-endchar;
-
-def quilisma(expr ymidtop, ymidbot) =
- ydiff:=0.15gregwidth;
- qdecalage:=.2*gregwidth;
- ydepth:=0.25gregwidth;
- x1=x14=-qdecalage+hlthick;
- x7=x8=gregwidth+hlthick;
- y1+ydiff-0.5ydepth=ymidtop=y7-ydiff-0.5ydepth;
- y14+ydiff-0.5ydepth=ymidbot=y8-ydiff-0.5ydepth;
- 3x3=2x1+x7; 3x5=x1+2x7;
- 3y3=2y1+y7; 3y5=y1+2y7;
- 2x2=x1+x3; 2x4=x3+x5; 2x6=x5+x7;
- 2y2=y1+y3-2ydepth; 2y4=y3+y5-2ydepth; 2y6=y5+y7-2ydepth;
- 3x12=2x14+x8; 3x10=x14+2x8;
- 3y12=2y14+y8; 3y10=y14+2y8;
- 2x13=x14+x12; 2x11=x12+x10; 2x9=x10+x8;
- 2y13=y14+y12-2ydepth; 2y11=y12+y10-2ydepth; 2y9=y10+y8-2ydepth;
-
- pickup line_pen;
-
-
- draw z1{down+0.1right}..z2..z3..z4..z5..z6..{up+0.1right}z7--z8{down}..z9..z10..z11..z12..z13..{up+0.1left}z14--cycle;
- fill z1{down+0.1right}..z2..z3..z4..z5..z6..{up+0.1right}z7--z8{down}..z9..z10..z11..z12..z13..{up+0.1left}z14--cycle;
- shift_pic(0,-hlthick);
-enddef;
-
-beginchar(125, 0, .5nhh#, .5nhh#); "quilisma";
- quilisma(0.5gregwidth-hlthick, -0.5gregwidth+hlthick);
-endchar;
-
-beginchar(126, 0, .5nhh#, .5nhh#); "bottom quilisma";
- quilisma(0.5gregwidth-hlthick-0.8shave, -0.5gregwidth+hlthick);
-endchar;
-
-%%%%%%%
-message ("<clefs>");
-%%%%%%%
-keygregwidth:=0.5*sqrt(2)*nhw;
-
-beginchar(98, 8/3nhw#, 3.25nhh#, 0); "gregorian C clef";
- x1=x4=0; x2=x3=keygregwidth; y1=y2=-y3=-y4=.5keygregwidth-lthick;
- fill z1{dir 15}..z2--z3{dir 165}..z4--cycle;
- save_elempic;
- pickup med_pen; draw bot rt z1..{down}(-.01nhw,-.5nhh);
- shift_pic(nhw,2.5nhh);
- add_mirror ((0,2nhh),(1,2nhh));
- savepic;
- shift_pic (0,-2nhh);
-endchar;
-
-beginchar(122, 8/3nhw#, 4.25nhh#, 0); "gregorian F clef";
- callpic;
- add_elempic (.1nhw+0.5med,2nhh);
- fill_square (med, 1.5nhh, (.75nhw,.8nhh));
- shift_pic (1/3nhw,-2nhh);
-endchar;
-
-end
+++ /dev/null
-font_identifier:="xhsld16";
-mode_setup;
-font_size 16pt#;
-thick#:=1pt#;
-stepwidth#:=1/8designsize;% -> \internote
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture save_pic;
-numheights:=16;
-numlengths:=8;%(20-90pt)
-
-code=-1;
-for j=1 upto numlengths:
- slength#:=(j+1)*10pt#;
- define_pixels(slength);
-
- for i=1 upto numheights:
- beginchar(incr code, slength#, 0, 0);
- x1=y1=0;x3=slength;y3=2y1'= i*stepwidth;
- x1'=.5x3;z3'-z1'=whatever*dir(angle(z3-z1)+90);
- if x3> y3:y3'=0;else:x3'=slength;fi
- z2=.5[z3',z1'];
- penpos1(thick,90);
- penpos2(2/3thick,(angle(z3-z1)+90));
- penpos3(.15thick,(angle(z3-z1)+90));
- penstroke z1e..z2e..z3e;
- pickup pencircle; draw z1..z2..z3;% draw z1--z3; draw z1'--z3';
- save_pic:=currentpicture;
- endchar;
-
- beginchar(128+code, slength#, 0, 0);
- currentpicture:=save_pic reflectedabout((.5slength,0),(.5slength, 1));
- endchar;
- endfor
-
-endfor
-end
+++ /dev/null
-font_identifier:="xhsld20";
-mode_setup;
-font_size 20pt#;
-thick#:=1pt#;
-stepwidth#:=1/8designsize;% -> \internote
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture save_pic;
-numheights:=16;
-numlengths:=8;%(20-90pt)
-
-code=-1;
-for j=1 upto numlengths:
- slength#:=(j+1)*10pt#;
- define_pixels(slength);
-
- for i=1 upto numheights:
- beginchar(incr code, slength#, 0, 0);
- x1=y1=0;x3=slength;y3=2y1'= i*stepwidth;
- x1'=.5x3;z3'-z1'=whatever*dir(angle(z3-z1)+90);
- if x3> y3:y3'=0;else:x3'=slength;fi
- z2=.5[z3',z1'];
- penpos1(thick,90);
- penpos2(2/3thick,(angle(z3-z1)+90));
- penpos3(.15thick,(angle(z3-z1)+90));
- penstroke z1e..z2e..z3e;
- pickup pencircle; draw z1..z2..z3;% draw z1--z3; draw z1'--z3';
- save_pic:=currentpicture;
- endchar;
-
- beginchar(128+code, slength#, 0, 0);
- currentpicture:=save_pic reflectedabout((.5slength,0),(.5slength, 1));
- endchar;
- endfor
-
-endfor
-end
+++ /dev/null
-font_identifier:="xhslu16";
-mode_setup;
-font_size 16pt#;
-thick#:=1pt#;
-stepwidth#:=1/8designsize;% -> \internote
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture save_pic;
-numheights:=16;
-numlengths:=8;%(20-90pt)
-
-code=-1;
-for j=1 upto numlengths:
- slength#:=(j+1)*10pt#;
- define_pixels(slength);
-
- for i=1 upto numheights:
- beginchar(incr code, slength#, 0, 0);
- x1=y1=0;x3=slength;y3=2y1'=-i*stepwidth;
- x1'=.5x3;z3'-z1'=whatever*dir(angle(z3-z1)+90);
- if x3>-y3:y3'=0;else:x3'=slength;fi
- z2=.5[z3',z1'];
- penpos1(thick,90);
- penpos2(2/3thick,(angle(z3-z1)+90));
- penpos3(.15thick,(angle(z3-z1)+90));
- penstroke z1e..z2e..z3e;
- pickup pencircle; draw z1..z2..z3;% draw z1--z3; draw z1'--z3';
- save_pic:=currentpicture;
- endchar;
-
- beginchar(128+code, slength#, 0, 0);
- currentpicture:=save_pic reflectedabout((.5slength,0),(.5slength, 1));
- endchar;
- endfor
-
-endfor
-end
+++ /dev/null
-font_identifier:="xhslu20";
-mode_setup;
-font_size 20pt#;
-thick#:=1pt#;
-stepwidth#:=1/8designsize;% -> \internote
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture save_pic;
-numheights:=16;
-numlengths:=8;%(20-90pt)
-
-code=-1;
-for j=1 upto numlengths:
- slength#:=(j+1)*10pt#;
- define_pixels(slength);
-
- for i=1 upto numheights:
- beginchar(incr code, slength#, 0, 0);
- x1=y1=0;x3=slength;y3=2y1'=-i*stepwidth;
- x1'=.5x3;z3'-z1'=whatever*dir(angle(z3-z1)+90);
- if x3>-y3:y3'=0;else:x3'=slength;fi
- z2=.5[z3',z1'];
- penpos1(thick,90);
- penpos2(2/3thick,(angle(z3-z1)+90));
- penpos3(.15thick,(angle(z3-z1)+90));
- penstroke z1e..z2e..z3e;
- pickup pencircle; draw z1..z2..z3;% draw z1--z3; draw z1'--z3';
- save_pic:=currentpicture;
- endchar;
-
- beginchar(128+code, slength#, 0, 0);
- currentpicture:=save_pic reflectedabout((.5slength,0),(.5slength, 1));
- endchar;
- endfor
-
-endfor
-end
+++ /dev/null
-font_identifier:="xsld11";
-mode_setup;
-font_size 10.24pt#;
-thick#:=1pt#;
-internote#:=1.28pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= reflectedabout (origin,right) shifted (-.5mw,0) enddef;
-def T= rotated 180 shifted (0,-mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xsld13";
-mode_setup;
-font_size 12.8pt#;
-thick#:=1pt#;
-internote#:=1.6pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= reflectedabout (origin,right) shifted (-.5mw,0) enddef;
-def T= rotated 180 shifted (0,-mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xsld16";
-mode_setup;
-font_size 16pt#;
-thick#:=1pt#;
-internote#:=2pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= reflectedabout (origin,right) shifted (-.5mw,0) enddef;
-def T= rotated 180 shifted (0,-mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xsld20";
-mode_setup;
-font_size 20pt#;
-thick#:=1pt#;
-internote#:=2.5pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= reflectedabout (origin,right) shifted (-.5mw,0) enddef;
-def T= rotated 180 shifted (0,-mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xsld24";
-mode_setup;
-font_size 24pt#;
-thick#:=1pt#;
-internote#:=3pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= reflectedabout (origin,right) shifted (-.5mw,0) enddef;
-def T= rotated 180 shifted (0,-mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xsld29";
-mode_setup;
-font_size 28.8pt#;
-thick#:=1pt#;
-internote#:=3.6pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= reflectedabout (origin,right) shifted (-.5mw,0) enddef;
-def T= rotated 180 shifted (0,-mheight) enddef;
-
-input xslgen;
+++ /dev/null
-min_bow:= internote;
-max_bow:=3internote;
-slope:=17.5/100;
-
-code=-1;
-
-for iht=1 upto 8:
- for iwd=0 upto 15:
- beginchar(incr code, 0, 0, 0);
- mw#:=(minwidth+iwd*delwidth)*pt#;
- define_pixels(mw);
- x1 = y1= 0; x3= mw; y3= 2y2'= iht*internote; x2'= .5x3;
- mheight:=y3;
- z2-z2'= whatever*dir(angle(z3-z1)+90);
- my_bow:=min(max_bow, slope*mw);
- my_bow:=max(my_bow, min_bow);
- z1'=(z1-(0,my_bow)) rotated angle(z3-z1);
- (z1'-z2)=whatever*(z1-z2');
- penpos1(.15thick,(angle(z3-z1)+90));
- penpos2(thick,(angle(z3-z1)+90));
- penpos3(.15thick,(angle(z3-z1)+90));
- penstroke (flex(z1e,z2e,z3e));
-%{{{
- currentpen:= pencircle;
- draw (flex(z1,z2,z3));% draw z1--z3; draw z2'--z2--z1'--z1;
-%}}}
- currentpicture:=currentpicture t;
- p:=currentpicture;
- endchar;
-
- beginchar(code+128, 0, 0, 0);
- currentpicture:=p T;
- endchar;
-
- endfor
-endfor
-end
+++ /dev/null
-thick#:=1pt#;
-stepwidth#:=designsize/8;
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture save_pic;
-numheights:=16;
-numlengths:=8;%(12-96pt)
-
-code=-1;
-for j=1 upto numlengths:
- slength#:=j*12pt#;
- define_pixels(slength);
-
- for i=1 upto numheights:
- beginchar(incr code, slength#, 0, 0);
- x1=y1=0;x2=slength;y2= i*stepwidth;
- penpos1(thick,90);
- penpos2(max(1,.15thick),min(2angle(z2-z1)+90,180));
- fill z1r{dir(1)}..{dir(min(2angle(z2-z1),90)-1)}z2r--
- z2l{dir(min(2angle(z2-z1)-180,-90))}..z1l{left}--cycle;
- save_pic:=currentpicture;
- endchar;
-
- beginchar(128+code, slength#, 0, 0);
- currentpicture:=save_pic reflectedabout((.5slength,0),(.5slength, 1));
- endchar;
- endfor
-
-endfor
-end
-
+++ /dev/null
-font_identifier:="xslhd11";
-mode_setup;
-font_size 10.24pt#;
-input xslhd;
-
+++ /dev/null
-font_identifier:="xslhd13";
-mode_setup;
-font_size 12.8pt#;
-input xslhd;
+++ /dev/null
-font_identifier:="xslhd16";
-mode_setup;
-font_size 16pt#;
-input xslhd;
-
+++ /dev/null
-font_identifier:="xslhd20";
-mode_setup;
-font_size 20pt#;
-input xslhd;
+++ /dev/null
-font_identifier:="xslhd24";
-mode_setup;
-font_size 24pt#;
-input xslhd;
+++ /dev/null
-font_identifier:="xslhd24";
-mode_setup;
-font_size 28.8pt#;
-input xslhd;
+++ /dev/null
-thick#:=1pt#;
-stepwidth#:=designsize/8;
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture save_pic;
-numheights:=16;
-numlengths:=8;%(12-96pt)
-
-code=-1;
-for j=1 upto numlengths:
- slength#:=j*12pt#;
- define_pixels(slength);
-
- for i=1 upto numheights:
- beginchar(incr code, slength#, 0, 0);
- x1=y1=0;x2=slength;y2=-i*stepwidth;
- penpos1(thick,90);
- penpos2(max(1,.15thick),min(2angle(z2-z1)+90,180));
- fill z1r{dir(1)}..{dir(min(2angle(z2-z1),90)-1)}z2r--
- z2l{dir(min(2angle(z2-z1)-180,-90))}..z1l{left}--cycle;
- save_pic:=currentpicture;
- endchar;
-
- beginchar(128+code, slength#, 0, 0);
- currentpicture:=save_pic reflectedabout((.5slength,0),(.5slength, 1));
- endchar;
- endfor
-
-endfor
-end
+++ /dev/null
-font_identifier:="xslhu11";
-mode_setup;
-font_size 10.24pt#;
-input xslhu.mf
+++ /dev/null
-font_identifier:="xslhu13";
-mode_setup;
-font_size 12.8pt#;
-input xslhu.mf
+++ /dev/null
-font_identifier:="xslhu16";
-mode_setup;
-font_size 16pt#;
-input xslhu.mf
-
+++ /dev/null
-font_identifier:="xslhu20";
-mode_setup;
-font_size 20pt#;
-input xslhu.mf
+++ /dev/null
-font_identifier:="xslhu24";
-mode_setup;
-font_size 24pt#;
-input xslhu.mf
+++ /dev/null
-font_identifier:="xslhu29";
-mode_setup;
-font_size 28.8pt#;
-input xslhu.mf
+++ /dev/null
-font_identifier:="xslhz20";
-mode_setup;
-font_size 20pt#;
-thick#:=1pt#;
-stepwidth#:=4pt#;
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture pic;
-
-slope=1/100;
-
-for i=1 upto 100:
- beginchar((i-1),0,0,0);
- x3=-x1=.5i*stepwidth; x2=y1=y3=0; y2=slope*i*stepwidth;
- penpos1(thick,90); penpos2(thick,90); penpos3(thick,90);
- penstroke z1e..z2e..z3e;
- pic:= currentpicture;
- endchar;
-
- beginchar((128+i-1),0,0,0);
- currentpicture:= pic reflectedabout(origin,right);
- endchar;
-endfor
-end
+++ /dev/null
-font_identifier:="xslu11";
-mode_setup;
-font_size 10.24pt#;
-thick#:=1pt#;
-internote#:=1.28pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= rotated 180 shifted (.5mw, mheight) enddef;
-def T= rotated 180 shifted (0,mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xslu13";
-mode_setup;
-font_size 12.8pt#;
-thick#:=1pt#;
-internote#:=1.6pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= rotated 180 shifted (.5mw, mheight) enddef;
-def T= rotated 180 shifted (0,mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xslu16";
-mode_setup;
-font_size 16pt#;
-thick#:=1pt#;
-internote#:=2pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= rotated 180 shifted (.5mw, mheight) enddef;
-def T= rotated 180 shifted (0,mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xslu20";
-mode_setup;
-font_size 20pt#;
-thick#:=1pt#;
-internote#:=2.5pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= rotated 180 shifted (.5mw, mheight) enddef;
-def T= rotated 180 shifted (0,mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xslu24";
-mode_setup;
-font_size 24pt#;
-thick#:=1pt#;
-internote#:=3pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= rotated 180 shifted (.5mw, mheight) enddef;
-def T= rotated 180 shifted (0,mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xslu29";
-mode_setup;
-font_size 28.8pt#;
-thick#:=1pt#;
-internote#:=3.6pt#;
-define_pixels(internote);
-define_blacker_pixels(thick);
-
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-maxwidth:=minwidth+15delwidth;
-fontdimen 5: maxwidth;
-
-picture p;
-
-def t= rotated 180 shifted (.5mw, mheight) enddef;
-def T= rotated 180 shifted (0,mheight) enddef;
-
-input xslgen;
+++ /dev/null
-font_identifier:="xslz20";
-mode_setup;
-font_size 20pt#;
-thick#:=1pt#;
-nhh#:=5pt#;
-define_pixels(nhh);
-define_blacker_pixels(thick);
-minwidth:=8pt#;
-delwidth:=4pt#;
-
-numslurs:=54;
-maxwidth:=minwidth+(numslurs-1)*delwidth;
-
-fontdimen 5: maxwidth;
-
-picture p;
-
-min_bow:= .4nhh;
-max_bow:= 1.75nhh;
-slope:= 10/100;
-
-code=-1;
-
-for i=1 upto numslurs:
-
- beginchar(incr code, 0, 0, 0);
- mw:=(minwidth+code*delwidth)*pt;
- x3= -x1= .5mw; x2= y1= y3 = 0;
- y2= max(min_bow, slope*mw);
- y2:= min(y2, max_bow);
- penpos1(.15thick,90); penpos2(thick,90); penpos3(.15thick,90);
- penstroke (flex(z1e,z2e,z3e));
- currentpen:= pencircle; draw (flex(z1,z2,z3));
- p:=currentpicture;
- endchar;
-
- beginchar(code+54, 0, 0, 0);
- currentpicture:=p reflectedabout (origin, right);
- endchar;
-
-endfor
-end
+++ /dev/null
-font_identifier:="xtie20";
-mode_setup;
-font_size 20pt#;
-thick#:=1pt#;
-stepwidth#:=4pt#;
-define_pixels(stepwidth);
-define_blacker_pixels(thick);
-picture pic;
-
-slope=.009;
-
-for i=1 upto 100:
- beginchar((i-1),0,0,0);
- x3=-x1=.5i*stepwidth; x2=y1=y3=0; y2=slope*i*stepwidth;
- penpos1(thick,90); penpos2(thick,90); penpos3(thick,90);
- penstroke z1e..z2e..z3e;
- pic:= currentpicture;
- endchar;
-
- beginchar((128+i-1),0,0,0);
- currentpicture:= pic reflectedabout(origin,right);
- endchar;
-endfor
-end
str += String( (char)( ( key_i_ + 2 ) % 7 + 'A' ) );
else // heu, -2: should be - 1 1/2: A -> fis
str += String( (char)( ( key_i_ + 2 - 2 ) % 7 + 'a' ) );
- str = String( "% " ) + '"' str + '"' + "; % not supported yet\n";
+ str = String( "% " ) + '"' + str + '"' + "; % not supported yet\n";
return str;
}
% A tex file to help determine dims.
%
-\font\musicfont=musix16
+\font\musicfont=musixsps
\font\slurfont=xslu16
\font\specfont=musixspx
% \def\thefont{\musicfont}
\def\emptybar{}
-\def\thinbar#1{\vrule height #1 width 1.6\staffrulethickness} % TODO parametric.
-\def\thickbar#1{\vrule height #1 width 2\smallspace}
-\def\maatstreep#1{\thinbar{#1}}
\def\defaultthinbar{\thinbar{\balkheight}}
\def\defaultthickbar{\thickbar{\balkheight}}
%? what-s wrong with rightalign?
-\def\finishbar#1{\rightalign{\thinbar{#1}\kern\smallspace\thickbar{#1}}}
-
\def\repeatstopbar{\hss\rightalign{\repeatcolon\hskip2\smallspace\defaultthinbar\hskip\smallspace\defaultthickbar}}
\def\repeatstartbar{\hbox{\defaultthickbar\kern\smallspace\defaultthinbar\kern2\smallspace\repeatcolon}}
\def\repeatstopstart{\hbox{\repeatcolon\kern2\smallspace\defaultthinbar\kern\smallspace\defaultthickbar\kern\smallspace\defaultthickbar\kern\smallspace\defaultthinbar\kern2\smallspace\repeatcolon}}
-\def\doublebar#1{\hbox{\thinbar{#1}\hskip\smallspace\thinbar{#1}}}
%compatibility
\def\repeatbar{\repeatstopbar}
\def\startrepeat{\repeatstartbar}
\def\repeatbarstartrepeat{\repeatstopstart}
+
+
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% parametric symbols
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+\def\doublebar#1{\hbox{\thinbar{#1}\hskip\smallspace\thinbar{#1}}}
+\def\thinbar#1{\vrule height #1 width 1.6\staffrulethickness} % TODO parametric.
+\def\thickbar#1{\vrule height #1 width 2\smallspace}
+\def\maatstreep#1{\thinbar{#1}}
+\def\finishbar#1{\rightalign{\thinbar{#1}\kern\smallspace\thickbar{#1}}}
+
+\def\pianobrace#1{{\musicdraw\char#1}}
\def\slurcharh#1{{\slurhfont\char#1}}
\def\slurcharu#1{{\slurufont\char#1}}
\def\slurchard#1{{\slurdfont\char#1}}