InitDeclarations 1
Declarations 1
# FlexLexer debug
-InitLexer 1
-Lexer 1
+InitLexer 0
+Lexer 0
parse_duration 1
parse_pitchmod 1
TOPLEVEL_MAJOR_VERSION = 0
TOPLEVEL_MINOR_VERSION = 0
-TOPLEVEL_PATCH_LEVEL = 57
+TOPLEVEL_PATCH_LEVEL = 58
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-18/Apr/97 LilyPond 0.0.57 1
+19/Apr/97 LilyPond 0.0.57 1
This will install the following files:
+ /usr/local/man/man1/mi2mu.1
+ /usr/local/man/man5/mudela.5
/usr/local/man/man1/lilypond.1
/usr/local/lib/libflower.{so,a}
/usr/local/bin/lilypond
/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
=item --enable-printing
-Enable debugging print routines (B<-d> option)
+Enable debugging print routines (lilypond B<-d> option)
=item --enable-optimise
Set the directory where texmf lives
-
=item --enable-tex-dir
-Set then directory tex input is in
+Set then directory tex input is in (detected as a subdir of tex-prefix)
=item --enable-mf-dir
-Set then directory tex input is in
+Set then directory tex input is in (idem)
=back
{ c () g }
>
+Q: and where do the beams come into this picture?
+
+A: Beams are voicegroup-wide, and may be entered in any part of the
+voicegroup:
+
+ < { [a () e] } { c () g } >
+ < { [a () e } { c () g] } >
+ < { [a () e] } { [c () g] } >
+
+These all give the same result.
Q: Why are [] around the notes, and () inbetween?
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
+commands in the mudela source. Moreover, this would be difficult. The
+manner in which Request (the basic building blocks of mudela) are
+translated into printable items is complex: it is not always possible
+to associate one Request with one Item or Spanner.
+
+
=head2 Miscellaneous
Q: Why GPL?
=head2 Comments
-Line comments are introduced by a C<%>.
+Line comments are introduced by a C<%>. Block comments are delimited
+by C<%{> and C<%}>. They do not nest.
=head2 Versions
\version "0.0.50";
A perl-script which tries to convert to newer versions
-(F<convert-mudela.pod>) is included in the LilyPond distribution.
+(F<convert-mudela>) is included in the LilyPond distribution.
=head2 Words
\word keyword, identifier, string
In Lyric mode every sequence of non-digit and non-white characters
-starting with an alphabetic character is considered a word.
+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
[c8 () d8 () e8 ]
-Please note that these two characters do I<not> necessarrily nest, eg:
+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]
+ [c8 e8(] [)g8 <c'8] e'8>
+ % NO nesting!
[c8 c8 c8]2/3 % a triplet
Symbols which can be put at either side (above or below) of a staff
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.
-28/Apr/97 LilyPond 0.0.57 1
+2/May/97 LilyPond 0.0.58 1
INSTALL(1) LilyPond documentation INSTALL(1)
+ /usr/local/man/man1/mi2mu.1
+ /usr/local/man/man5/mudela.5
/usr/local/man/man1/lilypond.1
/usr/local/lib/libflower.{so,a}
/usr/local/bin/lilypond
/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-
Make a shared library (linux, solaris (?) only )
--enable-printing
- Enable debugging print routines (-\b-\b-\b-d\bd\bd\bd option)
+ 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
-
-28/Apr/97 LilyPond 0.0.57 2
+2/May/97 LilyPond 0.0.58 2
INSTALL(1) LilyPond documentation INSTALL(1)
+ --enable-profiling
+ Compile with support for profiling
+
--enable-tex-prefix
Set the directory where texmf lives
--enable-tex-dir
- Set then directory tex input is in
+ Set then directory tex input is in (detected as a
+ subdir of tex-prefix)
--enable-mf-dir
- Set then directory tex input is in
+ Set then directory tex 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
GNU LilyPond does use a lot of resources. For operation
you need the following:
- +\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
-
-28/Apr/97 LilyPond 0.0.57 3
+2/May/97 LilyPond 0.0.58 3
INSTALL(1) LilyPond documentation INSTALL(1)
+ +\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)
+\bo TeX
-
-
-
-28/Apr/97 LilyPond 0.0.57 4
+2/May/97 LilyPond 0.0.58 4
+pl 58
+ - lexer cleanup
+ - national chars in lyrics
+ - \stem 2; bf
+ - long comments: %{ %}
+ - *.ini mode bf
+ - bf: partial may be everywhere
+ - bf: meterchange not at start of measure
+ - some doc updates
+ - bf: stem too long if stem is down.
+
+pl 57.jcn3
+ - dank je schat, voor wtk-i
+ - mi2mu tries to handle rests
+ - "!date" Thu May 1 02:34:04 MET DST 1997
+ - maak je het niet te laat schat?
+ XXXX HWN
+
+pl 57.jcn2
+ - small toccata-fuga-E.ly fixes
+ - \bar "||"; is now doublebar, "|." is finishbar
+ - collision hshift fix, with on-line assistance
+
pl 57
- lots of TODO doco
- text alignment bugfix
- bugfix Voice_group_regs::get_register_p() now is actually called too
- bugfix init of Text_item::pos_i_
+pl 56.jnc1
+ - toccata-fuga-in-E.ly, excerpts with real-life collisions
+ - \{l,r}{b,f}{toe,heel} --- using cmsy fonts...
+ - pedal.ly
+
pl 55.jcn1
- mi2mu man page
- make doc fixlet
PARSER
* Duration-> Musical_duration, typedef Rational Duration?
+HKN buglist:
+
+exitcode? (altijd 0)
+
+\bar || ook dunne streepjes? Sluit de balk niet af! (soms met de
+ruimte van een hele maat erachter (bij unmatching staffs)
+
+logfile?
+
+Gepunteerde rusten kloppen niet (punt eronder/boven ipv ernaast)
+
+Hele rusten ook in andere maatsoort dan 4/4 (en centreren in de maat)
+
+
+
+------------------------\
+barcheck failed in lyric mode -> assert (zie barcheck.ly) (0.0.57)
+------------------------/
+
+optie om te stoppen na eerste barcheck fail? (en wellicht in eerder
+stadium van precessing)
+
+noten staan vaak te dicht aan de rechterkant van de maatstreep.
+
+optie om nummers/markers boven maatstrepen te zetten
+
+tekst staat erg ver van notenbalken af
+
+barcheck her-synchroniseren? (evt met optie)
+
+script ^"3" onder ondanks boven?
+
+symbolen voor triller? (dus "tr---")
+
+mogelijkheid om complete regions te commenten (met /* */ ofzo)
+
+waarom geen ; achter dingen in \paper? (\textwidth 180\mm)
+(sowieso: wanneer wel en geen ; ?)
+
+Onduidelijk wanneer wel en geen \ voor een woord. Maak liever
+verplichte regels
+
+implementeren versieringen door duration *0 ofzo? (geeft nu assertion,
+zie duration0.ly)
+
+midi: instrumenten definieren?
+midi: tempo halverwege het stuk wijzigen?
+midi: gebonden noten niet herhalen?
+
+TeX literals invoegen?
+
+--------/\
+Dit geeft gigantische trubbels
+ < [d8.( e'32*2/3 d'32*2/3 cis'32*2/3 b16 d'16 cis'16 )b'16]
+ [b8. cis'32*2/3 b32*2/3 a32*2/3 gis16 fis16 e16 d16] >
+(zie file junkjunk.ly) Ik had natuurlijk wat accolades moeten
+plaatsen, maar ja...
+
+--------/\
+Inconsequent: ene keer wel, andere keer niet parse error?
+ipt.ini][/usr/local/share/lilypond/init//table_sixteen.ini]]./lacidarem.ly: 56:
+error: parse error:
+ <[d8. b8.> \duration 32; <e'*
+ 2/3 cis'*2/3> <d'*2/3 b*2/3>
+./lacidarem.ly: 56: error: parse error:
+ <[d8. b8.> \duration 32; <e'*2/3 cis'*2/3> <d'*
+ 2/3 b*2/3>
+./lacidarem.ly: 57: error: parse error:
+ <cis'*
+ 2/3 a*2/3> \duration 16; <b gis> <d' fis> <cis' e> <b' d]> |
+]./lacidarem.ly: 65: warning: Score contains errors. Will not process it. :
+--------/\
+De beam van de triool klopt niet.
+ <[d8. b8.> \duration 32; <e'32*2/3 cis'32*2/3> <d'32*2/3 b32*2/3>
+ <cis'32*2/3 a32*2/3> \duration 16; <b gis> <d' fis> <cis' e>
+<b d]> |
+(zie ook ergens in lacidarem-pianoI.ly)
+--------/
+scales.ly compileert niet meer (vanwege transpose?)
+
+Lengte van de stokken klopt vaak niet, zie bijv. de eerste maat van
+langestok.ly.
+
+Triolen enzo: het zou handig zijn als je het cijfer "3" ook _tussen_
+twee noten kon plaatsen. Dat is bijvoorbeeld nodig in
+c4*2/3 c8*2/3
+
+---------------\
+\bar "||" \meter 6/8; op het eind van de regel staat door elkaar
+gedrukt.
+
+
BUGS
* detect -pipe
* chlapik balk ruimte
- * standchen triool beam up/down
+ * standchen triool beam up/down
SEVERELY LACKING:
IDEAS
+ * output an intermediate format, move backend/output routines into
+ interpreter
+
* scoping in Lexer: do general id- assignments in mudela.
ID '=' EXPR;
* PostScript output (esp. Beams, Slurs, etc)
+ * poor man's ascii output possible?
+
+ * Output an output format independent (ofi) typeset file; and
+ make ofi2 TeX, MusixTex, PostScript, Ascii... interpreters.
+
* caching breakpoints
* use exceptions iso assert?
(junking test.tex and latex.test)
- rename {standchen,scsii-menuetto,...}.tex
+ * (related with above) --simple-mudela option for lily,
+ to lily input files with one-voice simple mudela
+ (no red tape)
+
+ * stack scripts in chords:
+ % fingering: footing:
+ < a-4 c-2 g-1 > < c-\ltoe e-\lheel >
+
+ * parameterised scripts for fingering and footing:
+
+ % toe to bheel four to five
+ % ^_u 4_5
+ % -
+ % --|x-- --|x--
+ % --|--- --|---
+ % --|--- --|---
+ (where "to" is a tiny bow)
+
}
+sub convert_0_0_54_to_0_0_55
+{
+ s/%{/% {/g;
+}
+
+
sub convert_0_0_53_to_0_0_54
{
print STDERR "Not smart enough to convert \\transpose\n" if (/\\transpose/) ;
}
+# we-re not at 58 yet, but this is at least one of the rules
+sub convert_0_0_55_to_0_0_56
+{
+ s/\"\|\|\"/\"|.\"/g;
+}
+
###############################################################
sub last_conversion
my %minor_conversions = (50 => \&no_conv,
52 => \&convert_0_0_50_to_0_0_52,
53 => \&convert_0_0_52_to_0_0_53,
- 54 => \&convert_0_0_53_to_0_0_54
+ 54 => \&convert_0_0_53_to_0_0_54,
+ 55 => \&convert_0_0_54_to_0_0_55,
+ 56 => \&convert_0_0_55_to_0_0_56
);
localinstall:
$(INSTALL) -d $(datadir)/lilypond/init
- $(INSTALL) -m 755 $(INIFILES) $(datadir)/lilypond/init
+ $(INSTALL) -m 644 $(INIFILES) $(datadir)/lilypond/init
localuninstall:
for i in $(INIFILES) ; do rm -f $(datadir)/lilypond/init/$$i; done
-%
-% common dutch names for notes. "es" means flat, "is" means sharp
-%
+%{
+ common dutch names for notes. "es" means flat, "is" means sharp
-%
-% Please note that, while these names are used to enter *notes*, they
-% actually are *melodic*s, i.e. they represent a pitch solely. Notes
-% have a rhythmic part too. This is the reason that we don't write 'note { .. }'
-%
+
+
+ Please note that, while these names are used to enter *notes*, they
+ actually are *melodic*s, i.e. they represent a pitch solely. Notes
+ have a rhythmic part too. This is the reason that we don't write 'note { .. }'
+
+%}
+
\notenames {
ceses = \melodic_request { -1 0 -2 }
ces = \melodic_request { -1 0 -1 }
tenuto = \script {"tenuto" 0 -1 0 0 }
upbow = \script { "upbow" 0 0 1 0 }
downbow = \script { "downbow" 0 0 1 0 }
-% toe = \script { "toe" 0 -1 0 0 }
-% heel = \script { "heel" 0 -1 0 0 }
lheel = \script { "heel" 0 0 -1 0 }
rheel = \script { "heel" 0 0 1 0 }
ltoe = \script { "toe" 0 0 -1 0 }
rtoe = \script { "toe" 0 0 1 0 }
+lbheel = \script { "bheel" 0 0 -1 0 }
+rbheel = \script { "bheel" 0 0 1 0 }
+lbtoe = \script { "btoe" 0 0 -1 0 }
+rbtoe = \script { "btoe" 0 0 1 0 }
+lfheel = \script { "fheel" 0 0 -1 0 }
+rfheel = \script { "fheel" 0 0 1 0 }
+lftoe = \script { "ftoe" 0 0 -1 0 }
+rftoe = \script { "ftoe" 0 0 1 0 }
+%
+% left toe: right heel:
+%
+% u -
+% - u
+% ---|-----|-- --|x----|x--
+% ---|-----|-- --|-----|---
+% --x|----x|-- --|-----|---
+% ^ -
+% - ^
+% back front back front
+%
+%
+% heu, me thought for a moment that order in table_xxx.ini was
+% being translated into priority...
+back = \script { "back" 0 -1 -1 0 }
+front = \script { "front" 0 -1 1 0 }
-\version "0.0.54";
+\version "0.0.56";
\include "register.ini"
\include "dynamic.ini"
% index TeXstring, xmin xmax ymin ymax
"scripts" = \table {
- "fermata" "\fermata" 0\pt 0\pt 0\pt 6\pt
- "-fermata" "\ifermata" 0\pt 0\pt -6\pt 0\pt
+ "fermata" "\fermata" 0\pt 0\pt 0\pt 6\pt
+ "-fermata" "\ifermata" 0\pt 0\pt -6\pt 0\pt
"portato" "\portato"
"-portato" "\iportato"
"tenuto" "\tenuto"
"-tenuto" "\itenuto"
"sforzato" "\sforzato" -0.8\pt 4.8\pt -1.92\pt 1.92\pt
- "marcato" "\marcato" 0\pt 4.8\pt 0\pt 4\pt
- "-marcato" "\imarcato" 0\pt 4.8\pt -4\pt 0\pt
- "staccato" "\staccato" 0\pt 0\pt 0\pt 5\pt
- "staccatissimo" "\staccatissimo" 0\pt 0\pt 0\pt 7.5\pt
+ "marcato" "\marcato" 0\pt 4.8\pt 0\pt 4\pt
+ "-marcato" "\imarcato" 0\pt 4.8\pt -4\pt 0\pt
+ "staccato" "\staccato" 0\pt 0\pt 0\pt 5\pt
+ "staccatissimo" "\staccatissimo" 0\pt 0\pt 0\pt 7.5\pt
"-staccatissimo" "\istaccatissimo" 0\pt 0\pt -7.5\pt 0\pt
"upbow" "\upbow" -1\pt 6\pt 0\pt 5\pt
- "downbow" "\downbow" 0\pt 5\pt 0\pt 7.5\pt
- "heel" "\heel" -1\pt 6\pt -5\pt 17.5\pt
- "toe" "\toe" 0\pt 5\pt -5\pt 17.5\pt
- }
+ "downbow" "\downbow" 0\pt 5\pt 0\pt 7.5\pt
+ "back" "\backorfront" 0\pt 6\pt 0\pt 3\pt
+ "-front" "\backorfront" -3\pt 5\pt 0\pt 3\pt
+% oeps, segfault
+% "heel" "\heel" 0\pt 6\pt -.5\pt 2\pt
+ "heel" "\heel" 0\pt 6\pt -1\pt 5\pt
+ "toe" "\toe" 0\pt 6\pt -1\pt 5\pt
+ "bheel" "\bheel" 0\pt 6\pt -1\pt 5\pt
+ "btoe" "\btoe" 0\pt 6\pt -1\pt 5\pt
+ "fheel" "\fheel" 0\pt 6\pt -1\pt 5\pt
+ "ftoe" "\ftoe" 0\pt 6\pt -1\pt 5\pt
+ "-back" "\backorfront" 0\pt 6\pt 0\pt 3\pt
+ "front" "\backorfront" 0\pt 6\pt 0\pt 3\pt
+ }
"style" = \table {
"roman" "\settext{%}" 0\pt 5\pt 0\pt 8\pt
"bars" = \table {
"empty" "\emptybar"
"|" "\maatstreep" 0\pt 0.4\pt -8\pt 8\pt
- "||" "\finishbar" 0\pt 2\pt -8\pt 8\pt
+ "||" "\doublebar" 0\pt 4\pt -8\pt 8\pt
+ "|." "\finishbar" -4\pt 0\pt -8\pt 8\pt
":|" "\repeatbar" -4\pt 0\pt -8\pt 8\pt
"|:" "\startrepeat" 0\pt 4\pt -8\pt 8\pt
":|:" "\repeatbarstartrepeat" 0\pt 16\pt -8\pt 8\pt
% Tested Features: cadenza mode
-\version "0.0.54";
+\version "0.0.56";
cad = \melodic {
% test the Collision resolution
-\version "0.0.54";
+\version "0.0.56";
two_voice_steminvert = \melodic {
< \multivoice
% when lily can handle this, i-ll type the other 304 bars
% (maybe even sooner :-)
%
-\version "0.0.54";
+\version "0.0.56";
alto = \melodic{
-\version "0.0.54";
+\version "0.0.56";
\include "this-is-hopefully-a-nonexisting-file"
a b ) ] % ok; error
% a......... % fatal error -- assert
a b c
- ||| %
+ |.| %
abc % ok; print error, no \output
\bla % STRING, reduced to lyric_elt.
a [ b % warning, still \output
% Tested Features:
%%End
-\version "0.0.54";
+\version "0.0.56";
%
% copyright: None
%
-\version "0.0.54";
+\version "0.0.56";
% declare melody (which will be in *one* staff ) for the lead voice
melodie = \melodic {
--- /dev/null
+% pedal.ly
+%
+% Johann Sebastian Bach
+% preludium en fuga in D
+% bwv 532
+%
+% fuga --- two bar excerpt of pedal part
+%
+% example for pedal studies
+
+% ugh, front and back priority are the same...
+% one must use (ugh):
+% left front:
+% -\front-\l{toe,heel}
+% left back:
+% -\l{toe,heel}-\back
+% rigth front:
+% -\r{toe,heel}-\front
+% right back:
+% -\back-\r{toe,heel}
+
+% therefore:
+% \lheel \ltoe \rheel \rtoe
+% \lbheel \lbheel \lfheel \lftoe
+% \rbheel \rbtoe \rfheel \rftoe
+
+\version "0.0.56";
+
+\score{
+ \staff{ melodicregs
+ \melodic {
+ \meter 4/4;
+ \key fis cis;
+ \clef bass;
+ \octave c;
+ % silly chord testing...
+% these should be stacked...
+% < 'c-\ltoe 'e-\lheel > < c'-\rtoe e'-\rheel>
+% < 'c-\lheel 'e-\ltoe > < c'-\rheel e'-\rtoe> |
+ < 'c-\ltoe-\lheel 'e > < c'-\rtoe-\rheel e' >
+ < 'c-\lheel-\ltoe 'e > < c'-\rheel-\rtoe e' > |
+ % 46
+ \duration 16;
+ [d-\lfheel e-\rbtoe fis-\ltoe e-\rbtoe]
+ [d-\lfheel e-\rbtoe fis-\lheel e] [d e fis e] [d e fis e] |
+ d4 r4 r4 [b-\rtoe a-\ltoe b-\rtoe fis-\ltoe] |
+ }
+ }
+ \paper{}
+}
+
%
% add any impressive examples here, please
+\version "0.0.56";
+
ritme = \staff {
melodicregs
\melodic{ %\octave ;
% scales with accents.
%
+\version "0.0.56";
blah = \staff{ melodicregs
\melodic {
\meter 6/8;
% scsii-menuetto.ly
%
% Solo Cello Suites
-% J. S. Bach
+% Johann Sebastian Bach (1685-1750)
+% bwv 000
%
% Suite II part v
% Menuetto I
% The purpose of this file is to demonstrate features of LilyPond.
% (there is an accompanying LaTeX file, scsii-menuetto.tex)
%
-\version "0.0.54";
+\version "0.0.56";
%% Stuff from MPP version
% \lefttitle{Menuetto}
% \tempo{Moderato}
% The purpose of this file is to demonstrate features of LilyPond.
% (there is an accompanying LaTeX file, standchen.tex)
%
-\version "0.0.54";
+\version "0.0.56";
commands = \melodic{
\skip 2.*4;
% volta2
\bar ":|";
\skip 2.*22;
- \bar "||";
+ \bar "|.";
}
melodie = \melodic{
--- /dev/null
+% toccata-fuga-E.ly
+%
+% toccata and fuga in E-major
+% Johann Sebastian Bach (1685-1750)
+% bwv 566
+%
+% toccata: 3 bar excerpt
+% 2nd fuga: transposed subject --- 4 bar except
+%
+% purpose of this file is testing:
+% * real-life collisions
+% * multi-voice input --- splitting?
+% * organ staff...
+%
+
+\version "0.0.56";
+
+toccata_commands = \melodic{
+ \meter 4/4;
+ \key fis cis gis dis; % E-major
+}
+
+%toccata_right = \melodic \$toccata_commands {
+toccata_right = \melodic{
+ \$toccata_commands ++
+ % 13 -- how to type -- where to split -- this more neatly ?
+ \octave c';
+ <\multivoice
+ { \stem 1; \hshift 1; r4 dis'4 e'4.-. e'8( | )e'4 [d'8 fis'8] gis'4 [gis'8 fis'16 e'16] | fis'4( )[fis'8 e'16 dis'16] e'4 r8 e'8 }
+ { \stem 1; r4 bis4 cis'4-. cis'4 | ais'4( )[ais'16 gis'16 ais'16 b'16] dis'4 cis'4( | )[cis'8 dis'16 ais16] bis4 cis'4 r8 b8 }
+ { \stem -1; r4 < gis4 fis4 dis4 > gis4-. gis4 | ais4. cis'8 gis2 | fis4 gis4 gis4 r8 e8 }
+ > |
+ % 16
+}
+
+toccata_left = \melodic{
+ \$toccata_commands ++
+ \octave c;
+ \clef bass;
+ % 13
+ <\multivoice
+ { \stem 1; bis2 cis'4-. cis'4( | )[cis'8 ais'8 d'8 cis'8] [bis8 gis8] cis'4 | dis'2 cis'4 r8 cis'8 }
+ { \stem 1; \hshift 1; r4 gis4. gis8( )gis4 | \stem -1; \hshift 0; ais4. fis8 gis4. ais8( | )ais4 gis4-. gis4 r8 gis8 }
+ { \stem -1; r4 < dis4 fis4 > < cis4 e4 > }
+ > |
+ % 16
+}
+
+toccata_pedal = \melodic{
+ \$toccata_commands ++
+ \octave c;
+ \clef bass;
+ % 13
+ r4 'fis4-\ltoe 'e4.-\lheel e8-\rheel |
+ % 14
+ fis4.-\rtoe fis8-.-\rtoe fis4-\rtoe [e8-\ltoe ais8-\rtoe] |
+ % 15
+ dis4-\ltoe gis4-\rtoe [cis8-\ltoe 'b8-\lheel 'ais8-\rtoe 'gis8-\ltoe] |
+ % 16
+}
+
+fuga2_commands = \melodic{
+ \meter 3/4;
+ \key fis cis gis dis; % E-major
+}
+
+fuga2_right = \melodic{
+ \$fuga2_commands ++
+ % 15
+ \octave c';
+ <\multivoice
+ { \stem 1; b8 fis8 b4 }
+ { \stem -1; fis2 }
+ >
+ <% \multivoice % heu?
+ { e'4 }
+ { cis'4 }
+ { ais4 }
+ { fis4 }
+ > |
+ % 16
+ <\multivoice
+ { \stem 1; dis'2 dis'4 | cis'2 cis'4 | b4( )[b8 cis'8 dis'8 e'8] }
+ { \stem 1; \hshift 1; b8 fis8 b2( | )[b8 a16 g16] a2 | a4 gis2 }
+ { \stem -1; fis2.( | )fis2.( | )fis4 e2 }
+ > |
+ % 19
+}
+
+fuga2_left = \melodic{
+ \$fuga2_commands ++
+ \octave c;
+ \clef bass;
+ % 15
+ b2
+ <\multivoice
+ { \stem 1; ais4 | bes2. }
+ { \stem -1; e4 | fis2 fis4 }
+ >
+ % 17
+ cis'2 e'4 |
+ % 18
+ b4. b8 b4 |
+}
+
+fuga2_pedal = \melodic{
+ \$fuga2_commands ++
+ \octave c;
+ \clef bass;
+ % 15
+ dis4.-\ltoe e8-\rtoe cis4 |
+ % 16
+ 'b4.-\lheel [c8-\ltoe dis8-\rtoe e8-\rheel] |
+ % 17
+ fis4.-\rtoe [e8-\rheel dis8-\rtoe cis8-\ltoe] |
+ % 18
+ dis4-\rtoe e4-\rheel 'e4-\ltoe |
+}
+
+break = \melodic{ \meter 4/4; r1 }
+
+% these should be two separate scores...
+\score{
+ \staff{ melodicregs
+ % why the extra "\melodic" (silly)
+ % let "[ x ]" be "dimension of x":
+ % [ melodic ++ melodic ] == [ simple-mudela ]
+ % [ \melodic{ melodic ++ melodic } ] == [ melodic ]
+ % ?
+ \melodic{
+ \$toccata_right ++ \break ++ \$fuga2_right
+ }
+ }
+ \staff{ melodicregs
+ \melodic{
+ \$toccata_left ++ \break ++ \$fuga2_left
+ }
+ }
+ \staff{ melodicregs
+ \melodic{
+ \$toccata_pedal
+ ++ \break
+ ++ \$fuga2_pedal
+ }
+ }
+ \paper{}
+ \midi{
+ \tempo 4:96
+ }
+}
+
% "Twinkle twinkle little star"
%
% Copyright: none
+\version "0.0.56";
+
+\version "0.0.55";
melody = \melodic{
\clef\violin;
global = \melodic {
\meter 2 / 4;
\skip 2*24;
-% \bar "||";
+% \bar "|.";
}
tekst = \lyric{
% Tested Features:stem direction, multivoice.
%
-\version "0.0.54";
+\version "0.0.56";
global = \melodic{
\meter 4/4 ;
// statics Duration
int Duration::division_1_i_s = 384 * 4;
+
+Duration::Duration( int type_i, int dots_i = 0)
+{
+// this breaks mi2mu quite effectively
+// assert(duration_type_b(type_i));
+ type_i_ = type_i;
+ dots_i_ = dots_i;
+ ticks_i_ = 0;
+}
+
bool
Duration::duration_type_b(int t)
{
return bit_i == 1;
}
-Duration::Duration( int type_i, int dots_i = 0)
-{
- assert(duration_type_b(type_i));
- type_i_ = type_i;
- dots_i_ = dots_i;
- ticks_i_ = 0;
-}
-
Moment
Duration::length() const
{
MAJOR_VERSION = 0
MINOR_VERSION = 0
-PATCH_LEVEL = 57
+PATCH_LEVEL = 58
+
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
-MY_PATCH_LEVEL =
+MY_PATCH_LEVEL = .jcn3
}
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()) {
clash_l_arr_.push(ncol_l);
add_dependency(ncol_l);
}
+
static
int idx(int dir, bool h_shift_b)
{
} while ((d *= -1) != 1);
-
+ // y_extent: smallest y-pos noteball interval containing all balls
+ // 4 (0..3) groups: stem up/down; shift on/off;
Interval_t<int> middle( y_extent[0].min(), y_extent[3].max());
Interval_t<int> open_middle( y_extent[3].max()+1, y_extent[0].min()-1);
do{
} while ((d *= -1) != 1);
if (!middle.empty_b() &&
- middle.length() <= 1 && col_l_a[idx(1,0)] && col_l_a[idx(-1,0)]) {
- Notehead * nu_l= col_l_a[idx(1,0)]->head_l_arr_[idx(1,0)];
- Notehead * nd_l = col_l_a[idx(-1,0)]->head_l_arr_[idx(1,0)];
+ middle.length() <= 2 && col_l_a[idx(1,0)] && col_l_a[idx(-1,0)]) {
+// reproduction of bugfix at 3am ?
+ Notehead * nu_l= col_l_a[idx(1,0)]->head_l_arr_[0];
+ Notehead * nd_l = col_l_a[idx(-1,0)]->head_l_arr_.top();
if (! (nu_l->balltype_i_ == nd_l->balltype_i_ && nu_l->dots_i_ == nd_l->dots_i_)) {
x_off[idx(1,0)] -= 0.5;
x_off[1] -= 0.5;
}
}
+
IMPLEMENT_STATIC_NAME(Collision);
%{ // -*-Fundamental-*-
+/*
+ lexer.l -- implement the Flex lexer
+
+ source file of the LilyPond music typesetter
+
+ (c) 1996,1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
#include <stdio.h>
%x lyrics
%x notes
%x quote
-
+%x longcomment
A [a-zA-Z]
RESTNAME [rs]
NOTECOMMAND \\{WORD}
DOTS \.+
-LYRICS {AA}[^0-9 \t\n\f]*
-COMMENT %.*\n
+LYRICS ({AA}|{NATIONAL})[^0-9 \t\n\f]*
%%
-<lyrics,INITIAL,notes>{COMMENT} {
+
+<notes,incl,INITIAL,lyrics>{
+ "%{" {
+ yy_push_state(longcomment);
+ }
+ %[^{\n].*\n {
+ }
+ %\n {
+ }
+ {WHITE}+ {
+
+ }
}
+<longcomment>{
+ [^\%]* {
+ }
+ \%*[^}%]* {
+ }
+ "%"+"}" {
+ yy_pop_state();
+ }
+}
<notes,INITIAL,lyrics>
\\include {
yy_push_state(incl);
}
-<incl>{WHITE}* { /* eat the whitespace */ }
<incl>\"[^"]*\" { /* got the include file name */
String s (YYText()+1);
s = s.left_str(s.length_i()-1);
mtor << "#include `" << s << "\'\n";
new_input(s,source_l_g);
yy_pop_state();
-}
-<*>{WHITE}+ {
-
}
<notes>{RESTNAME} {
const char *s = YYText();
s=s.left_str(s.length_i() - 1);
return scan_bare_word(s);
}
-<notes>{ALPHAWORD}/\' {
- post_quotes_b_ = true;
- return scan_bare_word(YYText());
-}
-<notes>\'+ {
- yylval.i = YYLeng();
- if (post_quotes_b_) {
- post_quotes_b_ = false;
- return POST_QUOTES;
- } else
- return PRE_QUOTES;
-}
-<notes>{ALPHAWORD} {
- return scan_bare_word(YYText());
+<notes>{
+ {ALPHAWORD}/\' {
+ post_quotes_b_ = true;
+ return scan_bare_word(YYText());
+ }
+ \'+ {
+ yylval.i = YYLeng();
+ if (post_quotes_b_) {
+ post_quotes_b_ = false;
+ return POST_QUOTES;
+ } else
+ return PRE_QUOTES;
+ }
+ {ALPHAWORD} {
+ return scan_bare_word(YYText());
-}
+ }
-<notes>{NOTECOMMAND} {
- return scan_escaped_word(YYText()+1);
-}
+ {NOTECOMMAND} {
+ return scan_escaped_word(YYText()+1);
+ }
-<notes>{DOTS} {
- yylval.i = strlen(YYText());
- return DOTS;
-}
-<notes>{INT} {
- yylval.i = String_convert::dec2_i( String( YYText() ) );
- return INT;
-}
+ {DOTS} {
+ yylval.i = strlen(YYText());
+ return DOTS;
+ }
+ {INT} {
+ yylval.i = String_convert::dec2_i( String( YYText() ) );
+ return INT;
+ }
-<notes>\+\+ {
- return CONCAT;
-}
-<notes>\" {
- start_quote();
+ \+\+ {
+ return CONCAT;
+ }
+ \" {
+ start_quote();
+ }
}
-
\" {
start_quote();
}
-<quote>\\\\ {
- *yylval.string += '\\';
-}
-<quote>\\\" {
- *yylval.string +='\"';
-}
-<quote>[^"]+ {
- *yylval.string += YYText();
-}
-<quote>\" {
- mtor << "quoted string: `" << *yylval.string << "'\n";
- yy_pop_state();
- return STRING;
+<quote>{
+ \\\\ {
+ *yylval.string += '\\';
+ }
+ \\\" {
+ *yylval.string +='\"';
+ }
+ [^"]+ {
+ *yylval.string += YYText();
+ }
+ \" {
+ mtor << "quoted string: `" << *yylval.string << "'\n";
+ yy_pop_state();
+ return STRING;
+ }
}
-<lyrics>\" {
- start_quote();
-}
-<lyrics>{DOTS} {
- yylval.i = strlen(YYText());
- return DOTS;
-}
-<lyrics>{INT} {
- yylval.i = String_convert::dec2_i( String( YYText() ) );
- return INT;
-}
-<lyrics>{NOTECOMMAND} {
- return scan_escaped_word(YYText()+1);
-}
-<lyrics>{LYRICS} {
- /* ugr. This sux. */
- String s (YYText());
- int i = 0;
- while ((i=s.index_i("_")) != -1) // change word binding "_" to " "
- *(s.ch_l() + i) = ' ';
- if ((i=s.index_i("\\,")) != -1) // change "\," to TeX's "\c "
- {
- *(s.ch_l() + i + 1) = 'c';
- s = s.left_str(i+2) + " " + s.right_str(s.length_i()-i-2);
- }
- yylval.string = new String(s);
- mtor << "lyric : `" << s << "'\n";
- return STRING;
-}
-<lyrics>\| {
- return YYText()[0];
-}
-<lyrics>[{}] {
- return YYText()[0];
-}
-<lyrics>. {
- return yylval.c = YYText()[0];
+<lyrics>{
+
+ \" {
+ start_quote();
+ }
+ {DOTS} {
+ yylval.i = strlen(YYText());
+ return DOTS;
+ }
+ {INT} {
+ yylval.i = String_convert::dec2_i( String( YYText() ) );
+ return INT;
+ }
+ {NOTECOMMAND} {
+ return scan_escaped_word(YYText()+1);
+ }
+ {LYRICS} {
+ /* ugr. This sux. */
+ String s (YYText());
+ int i = 0;
+ while ((i=s.index_i("_")) != -1) // change word binding "_" to " "
+ *(s.ch_l() + i) = ' ';
+ if ((i=s.index_i("\\,")) != -1) // change "\," to TeX's "\c "
+ {
+ *(s.ch_l() + i + 1) = 'c';
+ s = s.left_str(i+2) + " " + s.right_str(s.length_i()-i-2);
+ }
+ yylval.string = new String(s);
+ mtor << "lyric : `" << s << "'\n";
+ return STRING;
+ }
+ . {
+ return yylval.c = YYText()[0];
+ }
}
<<EOF>> {
<INITIAL,notes>. {
return yylval.c = YYText()[0];
}
+
<INITIAL,lyrics,notes>\\. {
char c= YYText()[1];
yylval.c = c;
Request*
get_stemdir_req(int d)
{
+ d = sign(long(d));
Group_feature_req * gfreq_p = new Group_feature_req;
gfreq_p->type_str_ = "vdir";
gfreq_p->value_str_ = String(d);
%{ // -*-Fundamental-*-
#include <iostream.h>
-#define MUDELA_VERSION "0.0.54"
+#define MUDELA_VERSION "0.0.56"
#include "script-def.hh"
#include "symtable.hh"
{
for (int i=0; i < script_l_arr_.size(); i++)
script_l_arr_[i]->translate(o);
+ for (int i=0; i < support_l_arr_.size(); i++)
+ support_l_arr_[i]->translate(o);
}
void
Staff_walker::process_timing_reqs()
{
+ // first all meter changes
for (int i=0; i < ptr()->timing_req_l_arr_.size(); i++) {
Timing_req * tr_l = ptr()->timing_req_l_arr_[i];
if (tr_l->meterchange()) {
}
}
+ // then do the rest
for (int i=0; i < ptr()->timing_req_l_arr_.size(); i++) {
Timing_req * tr_l = ptr()->timing_req_l_arr_[i];
if (tr_l->partial()) {
}
if (stem_req_l_) {
- stem_p_ = new Stem(4);
+ stem_p_ = new Stem(10);
if (current_grouping)
current_grouping->add_child(
get_staff_info().time_C_->whole_in_measure_,
// ugh... how about non 5-line staffs?
if ((max_head_i() < -2 && dir_i_ == 1 )
- ||(min_head_i() > staff_size_i_ + 2 && dir_i_ == -1) ){
+ ||(min_head_i() > staff_size_i_ && dir_i_ == -1) ){
set_stemend( staff_size_i_ /2 );
} else {
set_stemend( (dir_i_ > 0) ? max_head_i() + STEMLEN :
assert(o);
one_beat_ = Rational(1)/Moment(o);
whole_per_measure_ = Moment(l) * one_beat_;
- if(whole_in_measure_)
- error_t("Meterchange should be at start of measure", *this);
}
+
bool
Time_description::allow_meter_change_b()
{
String
Time_description::try_set_partial_str(Moment p)const
{
- if (when_)
- return ("Partial measure only allowed at beginning.");
if (p<Rational(0))
return ("Partial must be non-negative");
if (p > whole_per_measure_)
Begin3
Title: LilyPond
-Version: 0.0.57
-Entered-date: 04/28/97
+Version: 0.0.58
+Entered-date: 05/02/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
meters, clefs, keys, lyrics, versatile input-language, cadenzas
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.57.tar.gz
+ 300k lilypond-0.0.58.tar.gz
Alternate-site:
Original-site:
Platform: unix/win32, GNU C++
Name: lilypond
-Version: 0.0.57
+Version: 0.0.58
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: pcnov095.win.tue.nl:/pub/lilypond/lilypond-0.0.57.tar.gz
+Source0: pcnov095.win.tue.nl:/pub/lilypond/lilypond-0.0.58.tar.gz
Summary: A preprocessor to make TeX typeset music.
URL: http://www.stack.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@stack.nl>
MAJOR_VERSION = 0
MINOR_VERSION = 0
-PATCH_LEVEL = 13
+PATCH_LEVEL = 14
# use to send patches, always empty for released version:
MY_PATCH_LEVEL = # include separator: "-1" or ".a"
#
private:
void add_begin_at( PointerList<Midi_voice*>& open_voices_r, Moment mom );
+ int check_begin_bar_i( Moment now_mom, int open_bar_i );
+ int check_end_bar_i( Moment now_mom, int open_bar_i );
Midi_voice* get_free_midi_voice_l( Moment mom );
void remove_end_at( PointerList<Midi_voice*>& open_voices_r, Moment mom );
+ void output_mudela_begin_bar( Lily_stream& lily_stream_r, Moment now_mom, int bar_i );
+ void output_mudela_rest( Lily_stream& lily_stream_r, Moment begin_mom, Moment end_mom );
+ void output_mudela_rest_remain( Lily_stream& lily_stream_r, Moment mom );
+
IPointerList<Track_column*> tcol_p_list_;
IPointerList<Midi_voice*> midi_voice_p_list_;
int number_i_;
*os_p_ << "% from input file: ";
*os_p_ << midi_parser_l_g->filename_str_;
*os_p_ << "\n\n";
- *os_p_ << "\\version \"0.0.54\";\n";
+ *os_p_ << "\\version \"0.0.58\";\n";
}
/*
snapnie: dit kan toch automaties? Zie ook dstream.
0, "help", 'h',
0, "no-silly", 'n',
1, "output", 'o',
- 1, "no-plets", 'p',
+ 0, "no-plets", 'p',
0, "quiet", 'q',
1, "smallest", 's',
0, "verbose", 'v',
lily_stream << "\\score{";
lily_stream.indent();
for ( PCursor<Midi_track*> i( midi_track_p_list_.top() ); i.ok(); i++ ) {
- lily_stream << "\\staff{ ";
+ lily_stream << "\\staff{ melodicregs ";
lily_stream << i->name_str();
lily_stream << " }";
lily_stream.newline();
tcol_l( mom - midi_event_p->mom() )->add_event( midi_event_p );
}
-// too much red tape?
-String
-Midi_track::name_str()
+int
+Midi_track::check_begin_bar_i( Moment now_mom, int open_bar_i )
{
- return name_str_;
+ Moment bar_mom = midi_time_p_->bar_mom();
+ int bar_i = (int)( now_mom / bar_mom ) + 1;
+ if ( bar_i > open_bar_i ) {
+ tor( NORMAL_ver ) << '[' << flush;
+ return bar_i;
+ }
+ return 0;
+}
+
+int
+Midi_track::check_end_bar_i( Moment now_mom, int open_bar_i )
+{
+ Moment bar_mom = midi_time_p_->bar_mom();
+ int bar_i = (int)( now_mom / bar_mom ) + 1;
+ if ( bar_i > open_bar_i ) {
+ tor( NORMAL_ver ) << ']' << flush;
+ return bar_i;
+ }
+ return open_bar_i;
}
Moment
return midi_voice_l;
}
+// too much red tape?
+String
+Midi_track::name_str()
+{
+ return name_str_;
+}
+
Moment
Midi_track::next_begin_mom( Moment now_mom )
{
Midi_track::process()
{
int bar_i = 1;
- Moment bar_mom = midi_time_p_->bar_mom();
-
for ( PCursor<Track_column*> i( tcol_p_list_.top() ); i.ok(); i++ ) {
- int bars_i = (int)( i->mom() / bar_mom );
- if ( bars_i > bar_i )
- tor( NORMAL_ver ) << '[' << bar_i << flush;
+ int begin_bar_i = check_begin_bar_i( i->mom(), bar_i );
+ if ( begin_bar_i )
+ tor( NORMAL_ver ) << begin_bar_i << flush;
while ( i->midi_event_p_list_.size() )
get_free_midi_voice_l( i->mom() )->add_event( i->midi_event_p_list_.top().remove_p() );
- if ( bars_i > bar_i ) {
- bar_i = bars_i;
- tor( NORMAL_ver ) << ']' << flush;
- }
+ bar_i = check_end_bar_i( i->mom(), bar_i );
}
tor( DEBUG_ver ) << "ends: " << endl;
lily_stream_r.newline();
int bar_i = 0;
- Moment bar_mom = midi_time_p_->bar_mom();
PointerList<Midi_voice*> open_voices;
Moment now_mom = 0.0;
- Moment then_mom = 0.0;
- while ( now_mom < end_mom() ) {
- int bars_i = (int)( now_mom / bar_mom ) + 1;
- if ( bars_i > bar_i )
- tor( NORMAL_ver ) << '[' << flush;
-
- if ( bars_i > bar_i ) {
- Moment into_bar_mom = now_mom - Moment( bars_i - 1 ) * bar_mom;
- if ( bars_i > 1 ) {
- if ( !into_bar_mom )
- lily_stream_r << "|";
- lily_stream_r.newline();
- }
- lily_stream_r << "% " << String_convert::i2dec_str( bars_i, 0, ' ' );
- if ( into_bar_mom )
- lily_stream_r << ":" << Duration_convert::dur2_str( Duration_convert::mom2_dur( into_bar_mom ) );
- lily_stream_r.newline();
- }
-
+ /// ugh, avoid status track 0...
+ while ( number_i_ && ( now_mom < end_mom() ) ) {
+ int begin_bar_i = check_begin_bar_i( now_mom, bar_i );
+ if ( begin_bar_i )
+ output_mudela_begin_bar( lily_stream_r, now_mom, begin_bar_i );
add_begin_at( open_voices, now_mom );
Moment begin_mom = next_begin_mom( now_mom );
- if ( bars_i > bar_i )
- tor( NORMAL_ver ) << bars_i << flush;
+ if ( begin_bar_i )
+ tor( NORMAL_ver ) << begin_bar_i << flush;
Moment end_mom = next_end_mom( now_mom );
+ Moment then_mom = 0.0;
if ( ( begin_mom > now_mom ) && ( begin_mom < end_mom ) )
then_mom = begin_mom;
else
tor( DEBUG_ver ) << "begin: " << begin_mom << " end: " << end_mom << endl;
tor( DEBUG_ver ) << "slice: " << now_mom << ", " << then_mom << endl;
+// rests, ugh
+ String str;
+// if ( !open_voices.size() )
+// output_mudela_rest( lily_stream_r, now_mom, then_mom );
if ( open_voices.size() > 1 )
lily_stream_r << "< ";
for ( PCursor<Midi_voice*> i( open_voices.top() ); i.ok(); i++ )
- lily_stream_r << i->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
+// lily_stream_r << i->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
+ str += i->mudela_str( now_mom, then_mom, open_voices.size() - 1 );
+ if ( str.length_i() )
+ lily_stream_r << str;
+ else
+ output_mudela_rest( lily_stream_r, now_mom, then_mom );
+
if ( open_voices.size() > 1 )
lily_stream_r << "> ";
- now_mom = then_mom;
+ remove_end_at( open_voices, then_mom );
- remove_end_at( open_voices, now_mom );
- if ( bars_i > bar_i ) {
- bar_i = bars_i;
- tor( NORMAL_ver ) << ']' << flush;
- }
+ bar_i = check_end_bar_i( now_mom, bar_i );
+
+ now_mom = then_mom;
}
bar_i++;
tor( NORMAL_ver ) << '[' << bar_i << ']' << flush;
lily_stream_r.newline();
}
+
+void
+Midi_track::output_mudela_begin_bar( Lily_stream& lily_stream_r, Moment now_mom, int bar_i )
+{
+ Moment bar_mom = midi_time_p_->bar_mom();
+ Moment into_bar_mom = now_mom - Moment( bar_i - 1 ) * bar_mom;
+ if ( bar_i > 1 ) {
+ if ( !into_bar_mom )
+ lily_stream_r << "|";
+ lily_stream_r.newline();
+ }
+ lily_stream_r << "% " << String_convert::i2dec_str( bar_i, 0, ' ' );
+ if ( into_bar_mom )
+ lily_stream_r << ":" << Duration_convert::dur2_str( Duration_convert::mom2_dur( into_bar_mom ) );
+ lily_stream_r.newline();
+}
+
+
+void
+Midi_track::output_mudela_rest( Lily_stream& lily_stream_r, Moment begin_mom, Moment end_mom )
+{
+ Moment bar_mom = midi_time_p_->bar_mom();
+ Moment now_mom = begin_mom;
+ int begin_bar_i =(int)( now_mom / bar_mom ) + 1;
+ Moment remain_mom = now_mom - Moment( begin_bar_i - 1 ) * bar_mom;
+ if ( remain_mom > Moment( 0 ) )
+ output_mudela_rest_remain( lily_stream_r, remain_mom );
+
+ int end_bar_i = (int)( end_mom / bar_mom ) + 1;
+ now_mom += remain_mom;
+
+ int bar_i = (int)( now_mom / bar_mom ) + 1;
+ bar_i = check_end_bar_i( now_mom, bar_i );
+ for ( int i = 0; i < end_bar_i - begin_bar_i; i++ ) {
+ int begin_bar_i = check_begin_bar_i( now_mom, bar_i );
+ if ( begin_bar_i )
+ output_mudela_begin_bar( lily_stream_r, now_mom, begin_bar_i );
+ lily_stream_r << "r1 ";
+ tor( NORMAL_ver ) << begin_bar_i << flush;
+ bar_i = check_end_bar_i( now_mom, bar_i );
+ now_mom += bar_mom;
+ }
+ // use "int i" here, and gcc 2.7.2 hits internal compiler error
+ int ii = check_begin_bar_i( now_mom, bar_i );
+ if ( ii )
+ output_mudela_begin_bar( lily_stream_r, now_mom, ii );
+ bar_i = check_end_bar_i( now_mom, bar_i );
+
+ remain_mom = end_mom - Moment( end_bar_i - 1 ) * bar_mom;
+ if ( remain_mom > Moment( 0 ) )
+ output_mudela_rest_remain( lily_stream_r, remain_mom );
+}
+
+
+void
+Midi_track::output_mudela_rest_remain( Lily_stream& lily_stream_r, Moment mom )
+{
+ int type_i = 2;
+ while ( mom > Moment( 0 ) ) {
+ Duration dur( type_i );
+ Moment type_mom = Duration_convert::dur2_mom( dur );
+ int count_i = (int)( mom / type_mom );
+ for( int i = 0; i < count_i; i++ )
+ lily_stream_r << "r" << dur.str() << " ";
+ type_i *= 2;
+ mom -= Moment( count_i ) * type_mom;
+ if ( Duration_convert::no_smaller_than_i_s
+ && ( type_i > Duration_convert::no_smaller_than_i_s ) )
+ break;
+ }
+
+}
+
void
Midi_track::remove_end_at( PointerList<Midi_voice*>& open_voices_r, Moment mom )
{
for ( PCursor<Midi_voice*> i( open_voices_r.top() ); i.ok(); i++ )
-// if ( i->end_mom() == mom ) {
+// if ( i->end_mom() == mom ) { }
if ( i->end_mom() <= mom ) {
tor( DEBUG_ver ) << "open_voices (" << open_voices_r.size() << "): -1\n";
i.remove_p();
\def\vcenter#1{\vbox to 0pt{\vss #1\vss}}
\def\mathdef#1#2{\def#1{\mathchar{#2}}}
-% \def\mathchar#1{\mathfnt\char#1}
-\def\mathchar#1{$#1$}
-\def\mathaccentraise#1#2{\dimen0=\noteheight
- \rationalmultiply\dimen0*#2%
- \raise\dimen0\hbox{#1}}
-\def\mathaccentdef#1#2#3{\def#1{\mathaccentraise{\mathchar{#2}}{#3}}}
+\def\mathchar#1{\mathfont\char#1}
\def\topalign#1{\vbox to 0pt{#1\vss}}
\def\botalign#1{\vbox to 0pt{\vss #1}}
\font\musicdraw=musixsps
\font\italicfont=cmti10
\font\dynfont=cmbxti10 scaled \magstep1
+ \font\mathfont=cmsy10
\balkhoog=20pt
\notewidth=6pt
\noteheight=5pt
\font\musicfnt=musix16
\font\dynfont=cmbxti12
\font\musicdraw=musixsps
+ \font\mathfont=cmsy8
\balkhoog=16pt
\staffrulethickness=0.4pt
\notewidth=5pt
% \def\dyn{\italicfont}
\def\dyn{\dynfont}
\def\kdynf{\dynfont f\kern-.1ex}
-\def\kdynm{\dynfont f\kern-.15ex}
+\def\kdynm{\dynfont m\kern-.15ex}
\def\kdynp{\dynfont p\kern-.15ex}
\def\dynppp{\dynfont\dynp\kdynp p}
\def\emptybar{}
\def\thinbar{\vrule height\balkhoog}
-%? what-s wrong with rightalign?
\def\thickbar{\vrule height\balkhoog width 2\smallspace}
\def\maatstreep{\thinbar}
-% \def\finishbar{\rightalign{\thinbar\kern\smallspace\thickbar}}
-\def\finishbar{\hss\rightalign{\thinbar\kern\smallspace\thickbar}}
+%? what-s wrong with rightalign?
+\def\finishbar{\rightalign{\thinbar\kern\smallspace\thickbar}}
+%%% \def\finishbar{\hss\rightalign{\thinbar\kern\smallspace\thickbar}}
% \def\repeatstopbar{\rightalign{\repeatcolon\hskip2\smallspace\thinbar\hskip\smallspace\thickbar}}
\def\repeatstopbar{\hss\rightalign{\repeatcolon\hskip2\smallspace\thinbar\hskip\smallspace\thickbar}}
-% \def\repeatstopbar{\kern-3\smallspace\rightalign{\repeatcolon\kern2\smallspace\thinbar\kern\smallspace\thickbar}\kern3\smallspace}
\def\repeatstartbar{\hbox{\thickbar\kern\smallspace\thinbar\kern2\smallspace\repeatcolon}}
\def\repeatstopstart{\hbox{\repeatcolon\kern2\smallspace\thinbar\kern\smallspace\thickbar\kern\smallspace\thickbar\kern\smallspace\thinbar\kern2\smallspace\repeatcolon}}
\def\doublebar{\hbox{\thinbar\hskip\smallspace\thinbar}}
\mdef\downbow{22}
\mdef\portato{26}
-% \mathdef\heel\cup % "225B
-% \mathdef\toe\wedge % "225E
-\mathaccentdef\heel\cup{-1/1}
-\mathaccentdef\toe\wedge{-1/1}
+\mathdef\cup{91} % \cup
+\mathdef\wedge{94} % \wedge
+\mathdef\striepke{0} % heu?
+
+%% custom characters --- this should go: add to (meta!) font
+\def\myheel{\kern-.5ex\vbox{\cup}\kern-.5ex}
+\def\mytoe{\kern-.5ex\vbox{\wedge}\kern-.5ex}
+\def\mystriepke{\kern-1.1ex\vbox{\hbox{\kern-.05em\striepke}}\kern-1.1ex}
+
+\def\heel{\vbox{\myheel}}
+\def\toe{\vbox{\mytoe}}
+\def\backorfront{\mystriepke}
+
+\def\bheel{\vbox{\myheel\mystriepke}}
+\def\btoe{\vbox{\mytoe\mystriepke}}
+\def\fheel{\vbox{\mystriepke\myheel}}
+\def\ftoe{\vbox{\mystriepke\mytoe}}
+\def\heeltoe{\vbox{\myheel\mytoe}}
+\def\toeheel{\vbox{\mytoe\myheel}}
+%%
\def\stem#1#2{\vrule height#2 depth-#1}
+%
+% ideally, we should create a LaTeX/TeX class
+% for setting music in different sizes.
+%
+
\def\thetitle{}
\def\thecomposer{}
\def\theinstrument{}
{\bfseries\theinstrument}\hfill{\scshape\thecomposer}
\end{center}
\bigskip
- }
\ No newline at end of file
+ }