# class name silence?
Dstream 1
-My_lily_lexer 0
+My_lily_lexer 1
PCol 1
Score_column 1
Ineq_constrained_qp 1
# yydebug
InitParser 1
-Parser 0
+Parser 1
InitDeclarations 1
-Declarations 0
+Declarations 1
# FlexLexer debug
InitLexer 1
Lexer 1
TOPLEVEL_MAJOR_VERSION = 0
TOPLEVEL_MINOR_VERSION = 0
-TOPLEVEL_PATCH_LEVEL = 43
+TOPLEVEL_PATCH_LEVEL = 44
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
TOPLEVEL_MY_PATCH_LEVEL =
-#
const. Note that the proper order C<Type const> i.s.o. C<const Type>
+=item C<C>
+
+A const pointer. This would be equivalent to C<_c_l>, but since any
+"const" pointer has to be a link (you can't delete a const pointer),
+it is superfluous.
+
=item C<l>
temporary pointer to object (link)
development tools, and your make is gnu make. If this is not the
case, you can adjust your environment variables to your taste:
- CXXFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR" configure
+ export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR"
+ configure
+
+C<CPPFLAGS> are the preprocessor flags.
the configure script is Cygnus configure, and it will accept
B<--help>. If you are not root, you will probably have to make it with
LilyPond first reads 'symbol.ini', which contains declarations crucial
to proper operation of LilyPond (symbol tables, note names).
-
-This language looks a lot like Rayce's (Rayce is a raytracer that I've
-written as a hobby project. I used as a practice program for writing
-(among others) C++ and Yacc. It also gave me RSI :-( ) which in turn
-owes a lot to the POVRay raytracer. Now, I know, musictypesetting and
-Raytracing do not necessarily require the same input format, but I was
-just to lazy to make up a new and/or better input format. Suggestions
-appreciated.
+++ /dev/null
-=head1 NAME
-
-LilyInput - LilyPond input format -- Mudela 0.1
-
-B<NOTICE:> this doc describes the I<new> input format, S<Mudela 0.1>.
-
-=head1 DESCRIPTION
-
-This document describes the the LilyPond input format, which is an
-effective language for definining music. We call this language
-(rather arrogantly) The Musical Definition Language (S<Mudela 0.1>).
-
-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 design of Mudela has been (perfect past tense, hopefully)
-an ongoing process,
-the most important criteria being:
-
-=over 4
-
-=item *
-
-define the (musical) message of the composer as unambiguously as possible,
-
-=item *
-
-be intuitive, and easily readable
-(compared to, say, Musi*TeX input, or MIDI :-),
-
-=item *
-
-be writable in ASCII with a simple texteditor, yfte(TM).
-
-=back
-
-Other considerations were (and will be):
-
-=over 4
-
-=item *
-
-be able to edit the layout
-without danger of changing the original music (Urtext),
-
-=item *
-
-allow for adding different interpretations, again,
-without danger of changing the original,
-
-=item *
-
-easy to create a conductor's score,
-as well as the scores for all individual instruments,
-
-=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.,
-
-=item *
-
-easy to comprehend to both programmers and others.
-
-=back
-
-Musical pieces could be
-
-=over 5
-
-=item *
-
-Mahlerian orchestral scores,
-
-=item *
-
-piano pieces (Schubertian, Rachmaninovian),
-
-=item *
-
-pop songs (lyrics and chords),
-
-=item *
-
-gregorian chants,
-
-=item *
-
-Bach multivoice organ pieces,
-
-=item *
-
-short excerpts to be used in musicological publications.
-
-=back
-
-
-=head1 Overview
-
-The Musical Definition Language (Mudela) S<version 0.1>,
-has a logical structure,
-making use of typing and naming (using identifiers),
-that allows for flexible input, and definition reuse.
-
-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>):
-
-=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<%>
-
-=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:
-
- $Id_with###@weird92chars =
-
-=head2 Nesting characters
-
-Mudela uses the brace (C<{> and C<}>) for hierarchical structures. To
-aid the eye in reading, for chords the C<<> and the C<>> are used as
-nesting braces.
-
-=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, 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<\music>.
-In Note mode, a word is looked up in the following order:
-
- word identifier, string
- \word keyword, 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, string
-
-In Lyric mode every sequence of non-digit and non-white characters
-starting with an alphabetic character is considered a word.
-
-=back
-
-These modes are of a lexical nature. Normal and Note mode largely
-resemble each other, save the possibility of entering Reals, and
-meaning of C<_>
-
-=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 ' as well as the ` signify 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.
-
-The default language for notenames is defined to be dutch,
-
- % 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
- A % 110
- 'A % 55
- A' % 220
- Cisis
-
-The rest is named
-
- r
-
-These notenames along with duration is 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, eg:
-
- [c8 e8(] [)g8 c'8]
-
-
-Symbols which can be put at either side 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.
-
-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.
-
-The general form of a note is:
-
- post-requests de-octavate notename octavate duration pre-requests
-
-Notenames are just identifiers, and can be declared for any
-language appropriate (see F<dutch.ini>).
-
-=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 Rhythms
-
-Rhythms in Mudela are entered identical to Simple mudela.
-The melodic part of the information is ignored.
-
-=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{ melody }
- \staff{ accompany }
- \commands{ <score global commands> }
- \midi{ <midi definitions> }
- \paper{ <paper and layout definitions }
- }
-
-=head2 Examples
-
-Examples are included with the LilyPond distribution. For the sake of
-maintenance no long examples are included in this document.
-
-
-=head2 Other
-
-LilyPond first reads F<symbol.ini>, which contains declarations crucial
-to proper operation of LilyPond (symbol tables, note names).
--- /dev/null
+=head1 NAME
+
+Mudela - LilyPond input format 0.1
+
+=head1 DESCRIPTION
+
+This document describes the the LilyPond input format, which is an
+effective language for definining music. We call this language
+(rather arrogantly) The Musical Definition Language (S<Mudela 2>).
+
+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 design of Mudela has been (perfect past tense, hopefully)
+an ongoing process,
+the most important criteria being:
+
+=over 4
+
+=item *
+
+define the (musical) message of the composer as unambiguously as possible,
+
+=item *
+
+be intuitive, and easily readable
+(compared to, say, Musi*TeX input, or MIDI :-),
+
+=item *
+
+be writable in ASCII with a simple texteditor, yfte(TM).
+
+=back
+
+Other considerations were (and will be):
+
+=over 4
+
+=item *
+
+be able to edit the layout
+without danger of changing the original music (Urtext),
+
+=item *
+
+allow for adding different interpretations, again,
+without danger of changing the original,
+
+=item *
+
+easy to create a conductor's score,
+as well as the scores for all individual instruments,
+
+=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.,
+
+=item *
+
+easy to comprehend to both programmers and others.
+
+=back
+
+Musical pieces could be
+
+=over 5
+
+=item *
+
+Mahlerian orchestral scores,
+
+=item *
+
+piano pieces (Schubertian, Rachmaninovian),
+
+=item *
+
+pop songs (lyrics and chords),
+
+=item *
+
+gregorian chants,
+
+=item *
+
+Bach multivoice organ pieces,
+
+=item *
+
+short excerpts to be used in musicological publications.
+
+=back
+
+
+=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.
+
+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>):
+
+=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<%>
+
+=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:
+
+ $Id_with###@weird92chars =
+
+=head2 Nesting characters
+
+Mudela uses the brace (C<{> and C<}>) for hierarchical structures. To
+aid the eye in reading, for chords the C<<> and the C<>> are used as
+nesting braces.
+
+=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, 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<\music>.
+In Note mode, a word is looked up in the following order:
+
+ word identifier, string
+ \word keyword, 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, string
+
+In Lyric mode every sequence of non-digit and non-white characters
+starting with an alphabetic character is considered a word.
+
+ a&@&@&TSI|{[ % a word
+ 1THtrhortho % not a "word"
+ Leise Fl\"u\ss{}teren meine Sapfe % 4 words
+
+
+=back
+
+These modes are of a lexical nature. Normal and Note mode largely
+resemble each other, save the possibility of entering Reals, and
+meaning of C<_>
+
+=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 ' as well as the ' signify 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.
+
+The default language for notenames is defined to be dutch,
+
+ % 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
+
+The rest is named
+
+ r
+
+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, eg:
+
+ [c8 e8(] [)g8 c'8]
+
+
+Symbols which can be put at either side 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.
+
+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.
+
+The general form of a note is:
+
+ post-requests de-octavate notename octavate duration pre-requests
+
+Notenames are just identifiers, and can be declared for any
+language appropriate (see F<dutch.ini>).
+
+=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 notes have the same pitch.
+
+ c'' \octave{2} c
+
+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 LilyPond can stack voices and
+Voice_elements which are produced in two directions: horizontal
+(voice like) and vertical (chord like)
+
+You can start horizontal music by enclosing a sequence of notes with { and }
+
+ { 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 Rhythms
+
+Rhythms in Mudela are entered identical to Simple mudela.
+The melodic part of the information is ignored.
+
+=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{ melody }
+ \staff{ accompany }
+ \commands{ <score global commands> }
+ \midi{ <midi definitions> }
+ \paper{ <paper and layout definitions }
+ }
+
+=head2 Examples
+
+Examples are included with the LilyPond distribution. For the sake of
+maintenance no long examples are included in this document.
+
+
+=head2 Requests
+
+=head2 Voice
+
+=head2 Voice_element
+
+=head2 Voice groups
+
+=head2 Other
+
+LilyPond first reads F<symbol.ini>, which contains declarations crucial
+to proper operation of LilyPond (symbol tables, note names).
+
+=head1 HISTORY
+
+
+This language has a number of roots. First and foremost, 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.
+
-14/Mar/97 LilyPond 0.0.42 1
+24/Mar/97 LilyPond 0.0.44 1
your make is gnu make. If this is not the case, you can
adjust your environment variables to your taste:
- CXXFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR" configure
+ export CPPFLAGS="-I /home/me/my_include -DWEIRD_FOOBAR"
+ configure
+
+ CPPFLAGS are the preprocessor flags.
the configure script is Cygnus configure, and it will
accept -\b-\b-\b--\b-\b-\b-h\bh\bh\bhe\be\be\bel\bl\bl\blp\bp\bp\bp. If you are not root, you will probably have
compile. It's lot slower than most MusiXTeX
preprocessors)
- +\bo TeX
-
-
-14/Mar/97 LilyPond 0.0.42 2
+24/Mar/97 LilyPond 0.0.44 2
INSTALL(1) LilyPond documentation INSTALL(1)
+ +\bo TeX
+
+\bo The MusixTeX fonts. (I use those found in MusixTeX T.59)
Please refer to the man page for more information.
-
-
-14/Mar/97 LilyPond 0.0.42 3
+24/Mar/97 LilyPond 0.0.44 3
+******
+pl 44
+ - pure parser, My_lily_parser
+ - ''a iso ``a
+ - Includable_lexer
+ - junk Input_file
+ - Duration in parser, Duration restructuring
+ - grandiose lexer hax. Flex should be fixed, really.
+ Lexer much faster now.
+ - opps. mi2mu broken
+
******
pl 43
- transposition.
pl 42.hwn3
- const naming change (T const <-> const T)
- - Mudela 0.1
+ - Mudela 0.1 (roughly the same as below..)
pl 42.3
- moving towards Mudela 0.1:
* (almost) all keywords must be preceded by backslash '\'
* explicit lexer switches '$' and '@' dropped
* keyword "music" dropped for horizontal music
- * keywords "\lyric" "\melodic" "\rhythmic" introduced, e.g.:
+ * keywords "\lyric" " introduced, e.g.:
melody = \melodic { c c | g g }
* staff initialisable with music identifier:
\staff{ melody }
+
+warning: the --enable-optimise compile seems to broken!!
+
+===================
IMPORTANT:
if you have downloaded a
before 0.1
+
+ * fix -O2 -NDEBUG compile
* remove spurious/outdated comments in .ly, debug .ly
* decent TeX page layout
+ * per-pstaff item-widths
+
* remove unnecessary or confusing constructs from .ly
This is an assorted collection of stuff that will be done, might be
done, or is an idea that I want to think about
PARSER
- * Duration
+ * Duration-> Musical_duration, typedef Rational Duration?
MAKE-STUFF
* parshape
- * a pure parser?
-
- * read from mmap directly: study yy_scan_buffer
+ * read from mmap directly: bugreport to flex developers->
+ yy_scan_buffer in C++..
* binsearch/hash for identifiers
FUTURE
+ * slur parts as a script
+
+ * multiple scripst.
+
* mixed fontsizes
* put scripts on bars
* move MIDI io to a ANSI C libmidi library.
- * fold indentifiers and notenames?
-
* itemcolumns: Use dummy items.
* use an embedded language: scheme, lisp, S-lang, Perl, GUILE, ?
MAJOR_VERSION = 1
MINOR_VERSION = 1
-PATCH_LEVEL = 8
+PATCH_LEVEL = 9
# use to send patches, always empty for released version:
MY_PATCH_LEVEL = # include separator: "-1" or ".a"
#
+pl 1.1.9
+ - _C iso _c_l
+ - flower debug.
+
pl 1.1.8
--- /dev/null
+#include <fstream.h>
+#include "flower-debug.hh"
+#include "dstream.hh"
+
+bool flower_check_debug=false;
+ofstream null_device ( "/dev/null");
+Dstream default_flower_stream(&null_device ,"/dev/null");
+Dstream *flower_dstream = &default_flower_stream;
+
+/**
+ Set the debugging output. Will not delete/swallow argument.
+ */
+void set_flower_debug(Dstream&ds, bool b)
+{
+ flower_check_debug = b;
+ flower_dstream = &ds;
+}
+
--- /dev/null
+/*
+ flower-debug.hh -- declare
+
+ source file of the Flower Library
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef FLOWER_DEBUG_HH
+#define FLOWER_DEBUG_HH
+
+#include "dstream.hh"
+
+extern Dstream *flower_dstream;
+extern bool flower_check_debug;
+#ifdef NPRINT
+#define fdebug if ( 0 ) *flower_dstream
+#else
+#define fdebug if (flower_check_debug) \
+ flower_dstream->identify_as(__PRETTY_FUNCTION__)
+#endif
+void set_flower_debug(Dstream&ds, bool);
+
+#endif // FLOWER_DEBUG_HH
{
public:
/// locate a file in the search path
- String find(String nm);
+ String find(String nm)const;
/// construct using prefix. Normally argv[0].
File_path(String);
Array<String>::push;
void add(String str) { push(str); }
};
-/// split path into its components
+/** split a path into its components.
+
+ @params path
+
+ @return
+ String & drive, String &dirs, String &filebase, String &extension
+ */
void split_path(String path, String &drive, String &dirs, String &filebase, String &extension);
#endif
void tighten();
// assignment.
- void set( Byte const* byte_c_l, int length_i );
+ void set( Byte const* byte_C, int length_i );
- void set( char const* ch_c_l );
+ void set( char const* ch_C );
/// concatenation.
- void append( Byte const* byte_c_l, int length_i );
+ void append( Byte const* byte_C, int length_i );
- void operator += ( char const* ch_c_l );
+ void operator += ( char const* ch_C );
- char const* ch_c_l() const;
+ char const* ch_C() const;
char* ch_l();
- Byte const* byte_c_l() const;
+ Byte const* byte_C() const;
// idem, non const
Byte* byte_l();
}
// assignment.
INLINE void
-String_data::set( Byte const* byte_c_l, int length_i )
+String_data::set( Byte const* byte_C, int length_i )
{
OKW();
- assert( byte_c_l && byte_c_l != data_byte_p_);
+ assert( byte_C && byte_C != data_byte_p_);
length_i_ = length_i;
remax( length_i_ ); // copies too
- memcpy( data_byte_p_, byte_c_l, length_i_ );
+ memcpy( data_byte_p_, byte_C, length_i_ );
data_byte_p_[ length_i_ ] = 0;
}
INLINE
void
-String_data::set( char const* ch_c_l )
+String_data::set( char const* ch_C )
{
- set( (Byte const*)ch_c_l, strlen( ch_c_l ) );
+ set( (Byte const*)ch_C, strlen( ch_C ) );
}
/// concatenation.
INLINE void
-String_data::append( Byte const* byte_c_l, int length_i )
+String_data::append( Byte const* byte_C, int length_i )
{
OK();
OKW();
length_i_ += length_i;
remax( length_i_ );
- memcpy( data_byte_p_ + old_i, byte_c_l, length_i );
+ memcpy( data_byte_p_ + old_i, byte_C, length_i );
data_byte_p_[ length_i_ ] = 0;
}
INLINE
void
-String_data::operator += ( char const* ch_c_l )
+String_data::operator += ( char const* ch_C )
{
- append( (Byte const*)ch_c_l, strlen( ch_c_l ) );
+ append( (Byte const*)ch_C, strlen( ch_C ) );
}
INLINE
char const*
-String_data::ch_c_l() const
+String_data::ch_C() const
{
return (char const*)data_byte_p_;
}
}
INLINE Byte const*
-String_data::byte_c_l() const
+String_data::byte_C() const
{
return data_byte_p_;
}
~String_handle();
String_handle(String_handle const & src);
- Byte const* byte_c_l() const;
- char const* ch_c_l() const;
+ Byte const* byte_C() const;
+ char const* ch_C() const;
Byte* byte_l();
char* ch_l();
bool is_binary_bo()const;
Byte operator[](int j) const;
/** Access elements. WARNING: NOT SAFE
- don't use this for loops. Use byte_c_l()
+ don't use this for loops. Use byte_C()
*/
Byte &operator[](int j);
- void append( Byte const* byte_c_l, int length_i );
- void set( Byte const* byte_c_l, int length_i );
+ void append( Byte const* byte_C, int length_i );
+ void set( Byte const* byte_C, int length_i );
void operator = (char const *p);
void trunc(int j);
int length_i() const;
}
INLINE Byte
-const* String_handle::byte_c_l() const
+const* String_handle::byte_C() const
{
- return data->byte_c_l();
+ return data->byte_C();
}
INLINE char const*
-String_handle::ch_c_l() const
+String_handle::ch_C() const
{
- return (char const*)data->byte_c_l();
+ return (char const*)data->byte_C();
}
INLINE void
}
// !NOT SAFE!
-// don't use this for loops. Use byte_c_l()
+// don't use this for loops. Use byte_C()
INLINE Byte &
String_handle::operator[](int j)
{
}
INLINE void
-String_handle::append( Byte const* byte_c_l, int length_i )
+String_handle::append( Byte const* byte_C, int length_i )
{
copy();
- data->append( byte_c_l, length_i );
+ data->append( byte_C, length_i );
}
INLINE void
-String_handle::set( Byte const* byte_c_l, int length_i )
+String_handle::set( Byte const* byte_C, int length_i )
{
copy();
- data->set( byte_c_l, length_i );
+ data->set( byte_C, length_i );
}
INLINE void
/// String s = "abc";
String( char const* source );
- String( Byte const* byte_c_l, int length_i );
+ String( Byte const* byte_C, int length_i );
/// "ccccc"
String( char c, int n = 1 );
/// return a "new"-ed copy of contents
Byte* copy_byte_p() const; // return a "new"-ed copy of contents
- char const* ch_c_l() const;
- Byte const* byte_c_l() const;
+ char const* ch_C() const;
+ Byte const* byte_C() const;
char* ch_l();
Byte* byte_l();
- /// deprecated; use ch_c_l()
- operator char const* () const { return ch_c_l(); }
+ /// deprecated; use ch_C()
+ operator char const* () const { return ch_C(); }
String &operator =( String const & source );
class Dstream;
class String;
-void set_matrix_debug(Dstream&ds);
/** a row of numbers.
a vector. Storage is handled in Array, Vector only does the mathematics.
+++ /dev/null
-#include "dstream.hh"
-#include "matrix.hh"
-
-static Dstream *dout = 0;
-
-/**
- Set the debugging output. Will not delete/swallow argument.
- */
-void set_matrix_debug(Dstream&ds)
-{
- dout = &ds;
-}
-
-Matrix::operator String() const
-{
- String s;
-#ifndef NPRINT
- s="matrix {\n";
- for (int i=0; i< rows(); i++){
- for (int j = 0; j < cols(); j++) {
- s+= String(dat->elem(i,j), "%6f ");
- }
- s+="\n";
- }
- s+="}\n";
-#endif
- return s;
-}
-
-
-void
-Matrix::print() const
-{
-#ifndef NPRINT
- if (!dout)
- return;
- *dout << *this;
-#endif
-}
-
-Vector::operator String() const
-{
- String s;
-#ifndef NPRINT
- s="vector [";
- for (int i=0; i < dim(); i++) {
- s += String(dat[i], "%6f") + String(' ');
- }
- s+="]";
-#endif
- return s;
-}
-
-
-void
-Vector::print() const
-{
-#ifndef NDEBUG
- if (!dout)
- return;
- *dout << *this<<'\n';
-#endif
-}
--- /dev/null
+#include "flower-debug.hh"
+#include "matrix.hh"
+
+
+Matrix::operator String() const
+{
+ String s;
+#ifndef NPRINT
+ s="matrix {\n";
+ for (int i=0; i< rows(); i++){
+ for (int j = 0; j < cols(); j++) {
+ s+= String(dat->elem(i,j), "%6f ");
+ }
+ s+="\n";
+ }
+ s+="}\n";
+#endif
+ return s;
+}
+
+
+void
+Matrix::print() const
+{
+#ifndef NPRINT
+ fdebug << *this;
+#endif
+}
+
+Vector::operator String() const
+{
+ String s;
+#ifndef NPRINT
+ s="vector [";
+ for (int i=0; i < dim(); i++) {
+ s += String(dat[i], "%6f") + String(' ');
+ }
+ s+="]";
+#endif
+ return s;
+}
+
+
+void
+Vector::print() const
+{
+#ifndef NDEBUG
+ fdebug << *this<<'\n';
+#endif
+}
*/
#include <stdio.h>
#include "path.hh"
+#include "flower-debug.hh"
#ifndef PATHSEP
#define PATHSEP '/'
in any other added path, in this order.
*/
String
-File_path::find(String nm)
+File_path::find(String nm)const
+
{
- for (int i=0; i < size(); i++) {
+ fdebug << "looking for " << nm ;
+ for (int i=0; i < size(); i++) {
+
String path = (*this)[i];
path+= "/"+nm;
-
+ fdebug << path << "? ";
FILE *f = fopen(path, "r"); // ugh!
if (f) {
+ fdebug << "found\n";
fclose(f);
return path;
}
}
- return "";
+ fdebug << "\n";
+ return "";
}
int conv = false;
if (len()) {
long l =0;
- conv = sscanf(strh_.ch_c_l(), "%ld", &l);
+ conv = sscanf(strh_.ch_C(), "%ld", &l);
}
return len() && conv;
}
String_convert::bin2hex_str( String bin_str )
{
String str;
- Byte const* byte_c_l = bin_str.byte_c_l();
+ Byte const* byte_C = bin_str.byte_C();
for ( int i = 0; i < bin_str.length_i(); i++ ) {
- str += (char)nibble2hex_byte( *byte_c_l >> 4 );
- str += (char)nibble2hex_byte( *byte_c_l++ );
+ str += (char)nibble2hex_byte( *byte_C >> 4 );
+ str += (char)nibble2hex_byte( *byte_C++ );
}
return str;
}
return 0;
long l = 0;
- int conv = sscanf( dec_str.ch_c_l(), "%ld", &l );
+ int conv = sscanf( dec_str.ch_C(), "%ld", &l );
assert( conv );
return (int)l;
if ( !dec_str.length_i() )
return 0;
double d = 0;
- int conv = sscanf( dec_str.ch_c_l(), "%lf", &d );
+ int conv = sscanf( dec_str.ch_C(), "%lf", &d );
assert( conv );
return d;
}
hex_str = "0" + hex_str;
bin_str_r = "";
- Byte const* byte_c_l= hex_str.byte_c_l();
+ Byte const* byte_C= hex_str.byte_C();
int i = 0;
while ( i < hex_str.length_i() ) {
- int high_i = hex2nibble_i( *byte_c_l++ );
- int low_i = hex2nibble_i( *byte_c_l++ );
+ int high_i = hex2nibble_i( *byte_C++ );
+ int low_i = hex2nibble_i( *byte_C++ );
if ( high_i < 0 || low_i < 0 )
return 1; // illegal char
bin_str_r += String( (char)( high_i << 4 | low_i ), 1 );
Byte*
String::copy_byte_p() const
{
- Byte const* src = strh_.byte_c_l();
+ Byte const* src = strh_.byte_C();
Byte* dest = new Byte[strh_.length_i() + 1];
memcpy( dest, src, strh_.length_i() + 1 );
return dest;
String::print_on(ostream& os) const
{
if (!strh_.is_binary_bo())
- os << ch_c_l();
+ os << ch_C();
else
for ( int i = 0; i < length_i(); i++ )
os << (Byte)(*this)[ i ];
void
String::append(String s)
{
- strh_.append( s.byte_c_l(), s.length_i() );
+ strh_.append( s.byte_C(), s.length_i() );
}
void
String::operator +=(String s)
}
Byte const*
-String::byte_c_l() const
+String::byte_C() const
{
- return strh_.byte_c_l();
+ return strh_.byte_C();
}
char const*
-String::ch_c_l() const
+String::ch_C() const
{
- return strh_.ch_c_l();
+ return strh_.ch_C();
}
Byte*
int
String::compare_i(String const& s1, String const& s2 )
{
- Byte const* p1 = s1.byte_c_l();
- Byte const* p2 = s2.byte_c_l();
+ Byte const* p1 = s1.byte_C();
+ Byte const* p2 = s2.byte_C();
if ( p1 == p2 )
return 0;
if ( !length_i() )
return -1;
- char const* me = strh_.ch_c_l();
+ char const* me = strh_.ch_C();
char const* p = memrchr(me, length_i(), c );
if ( p )
return p - me;
int
String::index_i(char c ) const
{
- char const* me = strh_.ch_c_l();
+ char const* me = strh_.ch_C();
char const* p = (char const *) memchr( me,c, length_i());
if ( p )
return p - me;
int
String::index_i( String searchfor ) const
{
- char const* me = strh_.ch_c_l();
+ char const* me = strh_.ch_C();
char const* p = (char const *) memmem(
- me, length_i(), searchfor.ch_c_l(), searchfor.length_i());
+ me, length_i(), searchfor.ch_C(), searchfor.length_i());
if ( p )
return p - me;
if ( !n )
return -1;
- void const * me_l = (void const *) strh_.ch_c_l();
+ void const * me_l = (void const *) strh_.ch_C();
for (int i=0; i < set.length_i(); i++) {
char * found=(char*) memchr(me_l, set[i], n );
if (found) {
if ( n < 1)
return "";
- return String( strh_.byte_c_l() + length_i() - n, n );
+ return String( strh_.byte_C() + length_i() - n, n );
}
if ( ( n > length_i() ) || ( index_i + n > length_i() ) )
n = length_i() - index_i;
- return String( byte_c_l() + index_i, n );
+ return String( byte_C() + index_i, n );
}
\f
String
% common dutch names for notes. "es" means flat, "is" means sharp
%
-ceses = \melodic { 0 0 -2 }
-ces = \melodic { 0 0 -1 }
-c = \melodic { 0 0 0 }
-cis = \melodic { 0 0 1 }
-cisis = \melodic { 0 0 2 }
-deses = \melodic { 0 1 -2 }
-des = \melodic { 0 1 -1 }
-d = \melodic { 0 1 0 }
-dis = \melodic { 0 1 1 }
-disis = \melodic { 0 1 2 }
-eses = \melodic { 0 2 -2 }
-es = \melodic { 0 2 -1 }
-e = \melodic { 0 2 0 }
-eis = \melodic { 0 2 1 }
-eisis = \melodic { 0 2 2 }
-feses = \melodic { 0 3 -2 }
-fes = \melodic { 0 3 -1 }
-f = \melodic { 0 3 0 }
-fis = \melodic { 0 3 1 }
-fisis = \melodic { 0 3 2 }
-geses = \melodic { 0 4 -2 }
-ges = \melodic { 0 4 -1 }
-g = \melodic { 0 4 0 }
-gis = \melodic { 0 4 1 }
-gisis = \melodic { 0 4 2 }
-ases = \melodic { 0 5 -2 }
-as = \melodic { 0 5 -1 }
-a = \melodic { 0 5 0 }
-ais = \melodic { 0 5 1 }
-aisis = \melodic { 0 5 2 }
-beses = \melodic { 0 6 -2 }
-bes = \melodic { 0 6 -1 }
-b = \melodic { 0 6 0 }
-bis = \melodic { 0 6 1 }
-bisis = \melodic { 0 6 2 }
+ceses = \melodic { -1 0 -2 }
+ces = \melodic { -1 0 -1 }
+c = \melodic { -1 0 0 }
+cis = \melodic { -1 0 1 }
+cisis = \melodic { -1 0 2 }
+deses = \melodic { -1 1 -2 }
+des = \melodic { -1 1 -1 }
+d = \melodic { -1 1 0 }
+dis = \melodic { -1 1 1 }
+disis = \melodic { -1 1 2 }
+eses = \melodic { -1 2 -2 }
+es = \melodic { -1 2 -1 }
+e = \melodic { -1 2 0 }
+eis = \melodic { -1 2 1 }
+eisis = \melodic { -1 2 2 }
+feses = \melodic { -1 3 -2 }
+fes = \melodic { -1 3 -1 }
+f = \melodic { -1 3 0 }
+fis = \melodic { -1 3 1 }
+fisis = \melodic { -1 3 2 }
+geses = \melodic { -1 4 -2 }
+ges = \melodic { -1 4 -1 }
+g = \melodic { -1 4 0 }
+gis = \melodic { -1 4 1 }
+gisis = \melodic { -1 4 2 }
+ases = \melodic { -1 5 -2 }
+as = \melodic { -1 5 -1 }
+a = \melodic { -1 5 0 }
+ais = \melodic { -1 5 1 }
+aisis = \melodic { -1 5 2 }
+beses = \melodic { -1 6 -2 }
+bes = \melodic { -1 6 -1 }
+b = \melodic { -1 6 0 }
+bis = \melodic { -1 6 1 }
+bisis = \melodic { -1 6 2 }
%
%
-Ceses = \melodic { -1 0 -2 }
-Ces = \melodic { -1 0 -1 }
-C = \melodic { -1 0 0 }
-Cis = \melodic { -1 0 1 }
-Cisis = \melodic { -1 0 2 }
-Deses = \melodic { -1 1 -2 }
-Des = \melodic { -1 1 -1 }
-D = \melodic { -1 1 0 }
-Dis = \melodic { -1 1 1 }
-Disis = \melodic { -1 1 2 }
-Eses = \melodic { -1 2 -2 }
-Es = \melodic { -1 2 -1 }
-E = \melodic { -1 2 0 }
-Eis = \melodic { -1 2 1 }
-Eisis = \melodic { -1 2 2 }
-Feses = \melodic { -1 3 -2 }
-Fes = \melodic { -1 3 -1 }
-F = \melodic { -1 3 0 }
-Fis = \melodic { -1 3 1 }
-Fisis = \melodic { -1 3 2 }
-Geses = \melodic { -1 4 -2 }
-Ges = \melodic { -1 4 -1 }
-G = \melodic { -1 4 0 }
-Gis = \melodic { -1 4 1 }
-Gisis = \melodic { -1 4 2 }
-Ases = \melodic { -1 5 -2 }
-As = \melodic { -1 5 -1 }
-A = \melodic { -1 5 0 }
-Ais = \melodic { -1 5 1 }
-Aisis = \melodic { -1 5 2 }
-Beses = \melodic { -1 6 -2 }
-Bes = \melodic { -1 6 -1 }
-B = \melodic { -1 6 0 }
-Bis = \melodic { -1 6 1 }
-Bisis = \melodic { -1 6 2 }
+Ceses = \melodic { -2 0 -2 }
+Ces = \melodic { -2 0 -1 }
+C = \melodic { -2 0 0 }
+Cis = \melodic { -2 0 1 }
+Cisis = \melodic { -2 0 2 }
+Deses = \melodic { -2 1 -2 }
+Des = \melodic { -2 1 -1 }
+D = \melodic { -2 1 0 }
+Dis = \melodic { -2 1 1 }
+Disis = \melodic { -2 1 2 }
+Eses = \melodic { -2 2 -2 }
+Es = \melodic { -2 2 -1 }
+E = \melodic { -2 2 0 }
+Eis = \melodic { -2 2 1 }
+Eisis = \melodic { -2 2 2 }
+Feses = \melodic { -2 3 -2 }
+Fes = \melodic { -2 3 -1 }
+F = \melodic { -2 3 0 }
+Fis = \melodic { -2 3 1 }
+Fisis = \melodic { -2 3 2 }
+Geses = \melodic { -2 4 -2 }
+Ges = \melodic { -2 4 -1 }
+G = \melodic { -2 4 0 }
+Gis = \melodic { -2 4 1 }
+Gisis = \melodic { -2 4 2 }
+Ases = \melodic { -2 5 -2 }
+As = \melodic { -2 5 -1 }
+A = \melodic { -2 5 0 }
+Ais = \melodic { -2 5 1 }
+Aisis = \melodic { -2 5 2 }
+Beses = \melodic { -2 6 -2 }
+Bes = \melodic { -2 6 -1 }
+B = \melodic { -2 6 0 }
+Bis = \melodic { -2 6 1 }
+Bisis = \melodic { -2 6 2 }
\bar \empty
r8 [c d] [e f g gis]
\duration{4}
- a-> `f()`e g
- f-> `d()`cis e
+ a-> 'f()'e g
+ f-> 'd()'cis e
\duration{8}
d4^\fermata
\bar \empty
- r8 `a [`b cis]
+ r8 'a ['b cis]
\duration{16} [d cis d e]
f4()[f e d c]
- `b4
+ 'b4
\octave{} [d'8 c'8 a8]2/3
g2
\bar \empty
[g c e g] [c' e g c']\octave{'}
- [e `g c e] g4^\fermata %()% BUG!
+ [e 'g c e] g4^\fermata %()% BUG!
\bar \empty
[g8.(_"a \tempo" e g8. )e]
a4. g8 [f8 e8 d8 c8]
- `g2 d2^"tr"
+ 'g2 d2^"tr"
c4
}
}
%30:2
{
- \octave{ ` }
+ \octave{ -1 }
\textstyle "italic"
% this should be a \dynamic, rather than text
[ c c_"cresc. \ \ - \ \ \ \ - \ \ \ \ - \ \ \ \
< \multivoice
{ \stem{ 1 }[ c16^"div." c16 c16 c16 ] c4 c2 }
{
- \octave{ ` }
+ \octave{ -1 }
\textstyle "italic"
\stem{ -1 } [ as16_"\ff" as16 as16 as16 ] as4_"simile" as2
\textstyle "roman"
include "this-is-hopefully-a-nonexisting-file"
mwa = \music {
-
+ \meter{3/4}
[ a8 a8 a8 a8 a8 ] %
[ a8 ] %
% segfault
a b c
||| %
abc % ok; print error, no \output
- \bla % no warning-> this STRING, reduced to lyric_elt.
+ \bla % STRING, reduced to lyric_elt.
a [ b % warning, still \output
- { a( b } % warning, still \output
+ < a( b > % warning, still \output
a b ,c
a b c-*
a b c&
- { a-. b-. }
+ < a-. b-. >
}
-bla = \music {
- @
+bla = \lyrics {
These Gates will open just like windows. % ok; warning
- @
}
include "this-is-hopefully-a-nonexisting-file"
-
-score {
+\score {
\staff {
lyric \music { bla }
}
\staff {
\melodic \music { mwa }
}
- \co\mmands {
- \meter {3/4}
- }
}
% instrument:
c8 d8 e8 f8. { \music{ g16 } } { \music{ f16 } } {
\music{ e8 } } a8 d8 { \music{ g8. } } a16 g16 f16
- e16 f16 e16 d16 c16 d16 c16 `b16 `a8 fis8 { \music{
+ e16 f16 e16 d16 c16 d16 c16 'b16 'a8 fis8 { \music{
g4. } } f16 e16 f8 d8 g8 f8 e8 d8 g4 f16 e16 f4 f16
e8 d4 c8 f8 g16 f16 e16 f8 d8 g4.. g8 a8 b8 {
\music{ c'8. } } { \music{ d'16 } } { \music{ c'16 }
track3 = \music {
% \midi copyright:
% instrument:
- `g8 `a8 `b8 c8. { \music{ d16 } } { \music{ c16 } }
- { \music{ `b8 } } e8 `a8 { \music{ d8. } } e16 d16
- c16 `b8 c4 `ais8 `a8 d8 `g8 c8 `a16 `b16 c16 d4 `g4
- `g8 `a8 `b8 c8. { \music{ d16 } } { \music{ c16 } }
- { } `b8 e8 `a8 d8. e16 d16 c16 `b8 e4. d4 `b16 c16
- `a16 e16 d16 c16 `b16 c16 `a16 `b16 c16 d16 c16
- `b16 `a16 `g4 `e8 `fis8 `gis8 `a8. { \music{ `b16 }
- } { \music{ `a16 } } { \music{ `g8 } } c8 `fis8
- `b8. c16 `b16 `a16 `gis8 { \music{ `a4 } } `gis8
- `a4 `g8 `a8 `b8 c8. { \music{ d16 } } { \music{ c16
- } } { \music{ `b8 } } e8 `a8 d4 `g8 d4 c8 `a8 e4 d8
- `a8 `b8 cis8 d8. { \music{ e16 } } { \music{ d16 }
- } { \music{ c8 } } f8 `b8 e8. f16 e16 d16 cis8 `a8
- `b8 cis8 d8. { \music{ e16 } } { \music{ d16 } } {
- \music{ c8 } } fis8 `b8 e8. fis16 e16 d16 c4.. d16
- c16 `b16 `a16 `g16 `a16 `fis16 `g8 `b8 c8 { \music{
+ 'g8 'a8 'b8 c8. { \music{ d16 } } { \music{ c16 } }
+ { \music{ 'b8 } } e8 'a8 { \music{ d8. } } e16 d16
+ c16 'b8 c4 'ais8 'a8 d8 'g8 c8 'a16 'b16 c16 d4 'g4
+ 'g8 'a8 'b8 c8. { \music{ d16 } } { \music{ c16 } }
+ { } 'b8 e8 'a8 d8. e16 d16 c16 'b8 e4. d4 'b16 c16
+ 'a16 e16 d16 c16 'b16 c16 'a16 'b16 c16 d16 c16
+ 'b16 'a16 'g4 'e8 'fis8 'gis8 'a8. { \music{ 'b16 }
+ } { \music{ 'a16 } } { \music{ 'g8 } } c8 'fis8
+ 'b8. c16 'b16 'a16 'gis8 { \music{ 'a4 } } 'gis8
+ 'a4 'g8 'a8 'b8 c8. { \music{ d16 } } { \music{ c16
+ } } { \music{ 'b8 } } e8 'a8 d4 'g8 d4 c8 'a8 e4 d8
+ 'a8 'b8 cis8 d8. { \music{ e16 } } { \music{ d16 }
+ } { \music{ c8 } } f8 'b8 e8. f16 e16 d16 cis8 'a8
+ 'b8 cis8 d8. { \music{ e16 } } { \music{ d16 } } {
+ \music{ c8 } } fis8 'b8 e8. fis16 e16 d16 c4.. d16
+ c16 'b16 'a16 'g16 'a16 'fis16 'g8 'b8 c8 { \music{
d8 } } e8. { \music{ f16 } } { \music{ e16 } } {
\music{ d8 } } g8 c8 f8. g16 f16 e16 d4 e8 d4 {
- \music{ `g8 } } `g4. `c8 `d8 `e8 `f8. { \music{
- `g16 } } { \music{ `f16 } } { \music{ `e8 } } `a8
- `d8 { \music{ `g8. } } `a16 `g16 `f16 `e16 `d16
- `e16 `f16 `g16 `a16 `ais16 `g16 `a16 `e16 `f16 `g16
- `a16 `b16 c16 { \music{ `a16 } \music{ d2 } } c1
+ \music{ 'g8 } } 'g4. 'c8 'd8 'e8 'f8. { \music{
+ 'g16 } } { \music{ 'f16 } } { \music{ 'e8 } } 'a8
+ 'd8 { \music{ 'g8. } } 'a16 'g16 'f16 'e16 'd16
+ 'e16 'f16 'g16 'a16 'ais16 'g16 'a16 'e16 'f16 'g16
+ 'a16 'b16 c16 { \music{ 'a16 } \music{ d2 } } c1
} % track3
track4 = \music {
% \midi copyright:
% instrument:
- `c8 `d8 `e8 `f8. { \music{ `g16 } } { \music{ `f16 }
- } { \music{ `e8 } } `a8 `d8 { \music{ `g8. } }
- `a16 `g16 `f16 `e16 `f16 `e16 `d16 `c16 `d16 `c16
- ``b16 ``a8 `d8 `a8 `fis8 `g16 `a16 `ais16 `g16
- `cis8 `d8 `a4 `e4 `a16 `b16 c16 d16 c16 `b16 `a16
- `g16 c8 ``g8 ``a8 ``b8 `c8. { \music{ `d16 } } {
- \music{ `c16 } } { \music{ ``b8 } } `e8 ``a8 `d8.
- `e16 `d16 `c16 { \music{ ``b8 } } `e4 `d8 `c8 `f4
- `e4 `d4 `e8 `f8 `e16 `d16 `e4 ``a4 ``g8 ``a8 ``b8
- `c8. { \music{ `d16 } } { \music{ `c16 } } { \music{
- ``b8 } } `e8 ``a8 `d8. `e16 `d16 `c16 ``b8 ai``s8
- ``a8 ``g8 ``a8 `fis8 `g8 `e8 `d4 `e8 `f8 `g8. {
- \music{ `a16 } } { \music{ `g16 } } { \music{ `f8 }
- } `ais8 `e8 `a8. `b16 { \music{ `a16 } } `g16 `f16
- `e16 `f16 `d16 `g8 `a8 `d4.. `e16 `d16 `c16 ``b16
- ``a16 ``g16 fi``s16 ``e8 `e8 `fis8 `g4 `a16 `g16
- `fis8 `d8 `g1 `a4 `b8 c8 `f16 `a16 `g16 `f16 `e16
- `d16 `c16 ``b16 `c16 `d16 `e16 `f16 `g8 ``g8 `b2
+ 'c8 'd8 'e8 'f8. { \music{ 'g16 } } { \music{ 'f16 }
+ } { \music{ 'e8 } } 'a8 'd8 { \music{ 'g8. } }
+ 'a16 'g16 'f16 'e16 'f16 'e16 'd16 'c16 'd16 'c16
+ ''b16 ''a8 'd8 'a8 'fis8 'g16 'a16 'ais16 'g16
+ 'cis8 'd8 'a4 'e4 'a16 'b16 c16 d16 c16 'b16 'a16
+ 'g16 c8 ''g8 ''a8 ''b8 'c8. { \music{ 'd16 } } {
+ \music{ 'c16 } } { \music{ ''b8 } } 'e8 ''a8 'd8.
+ 'e16 'd16 'c16 { \music{ ''b8 } } 'e4 'd8 'c8 'f4
+ 'e4 'd4 'e8 'f8 'e16 'd16 'e4 ''a4 ''g8 ''a8 ''b8
+ 'c8. { \music{ 'd16 } } { \music{ 'c16 } } { \music{
+ ''b8 } } 'e8 ''a8 'd8. 'e16 'd16 'c16 ''b8 ai''s8
+ ''a8 ''g8 ''a8 'fis8 'g8 'e8 'd4 'e8 'f8 'g8. {
+ \music{ 'a16 } } { \music{ 'g16 } } { \music{ 'f8 }
+ } 'ais8 'e8 'a8. 'b16 { \music{ 'a16 } } 'g16 'f16
+ 'e16 'f16 'd16 'g8 'a8 'd4.. 'e16 'd16 'c16 ''b16
+ ''a16 ''g16 fi''s16 ''e8 'e8 'fis8 'g4 'a16 'g16
+ 'fis8 'd8 'g1 'a4 'b8 c8 'f16 'a16 'g16 'f16 'e16
+ 'd16 'c16 ''b16 'c16 'd16 'e16 'f16 'g8 ''g8 'b2
} % track4
score {
% you to precede \keyword by a backslash: \
\music {
\clef "bass"
- \octave { ` } % default \octave: 1 below the first \octave.
+ \octave { ' } % default \octave: 1 below the first \octave.
%%% theme
- `c % ` means one \octave lower.
+ 'c % ' means one \octave lower.
% Similarly: ' means one higher.
- c e c f c e c d `b c `a `f `g `c2
- \octave { ` }
- e `g d `g c `g `b `g e `g d `g c `g `b `g
+ c e c f c e c d 'b c 'a 'f 'g 'c2
+ \octave { ' }
+ e 'g d 'g c 'g 'b 'g e 'g d 'g c 'g 'b 'g
%%%% var 1
r8 e8() c r8 e8() c r8 f8()c r8 e8()c
- r8 d8()`b r8 c8()`a r8 `a8()`f r8 `e8()`c
+ r8 d8()'b r8 c8()'a r8 'a8()'f r8 'e8()'c
}
\duration {4}
<
- { c () `bes [c8 c8] }
+ { c () 'bes [c8 c8] }
{ fis' ()gisis' fis8 fis8 }
{ d () d dis8 dis8 }
{ a () bes eis8 eis8 }
[d8 e8 f'8 g8] d8 e8 f8 g8
|fis''2
- | a8 b8 c'8 d'8 |c''8 ```c8 c4 |c4 c4 |c4
- \duration{ 16 } `b `a `g `f \duration{ 4}
+ | a8 b8 c'8 d'8 |c''8 '''c8 c4 |c4 c4 |c4
+ \duration{ 16 } 'b 'a 'g 'f \duration{ 4}
\clef\bass
- |c `b `a `g `f `e `d `c ``b ``a ``g ``f ``e ``d ``c
+ |c 'b 'a 'g 'f 'e 'd 'c ''b ''a ''g ''f ''e ''d ''c
}
}
begeleiding = \music {
\clef \bass
- \octave{`}
+ \octave{-1}
c c' | e' c' | f' c' | e' c'
d' b | c' a | f g | c2 |
\octave{}
\key{fis}
%1
- [ `b8. `a ] [ `g8 `b c ] |
+ [ 'b8. 'a ] [ 'g8 'b c ] |
%2
[ d8 g8 ] d4 |
%3
[ e fis g a ] d4 |
%4
- [ c `b `a `b ] `b4 |
+ [ c 'b 'a 'b ] 'b4 |
%5=1
- [ `b8. `a ] [ `g8 `b c ] |
+ [ 'b8. 'a ] [ 'g8 'b c ] |
%6=2
[ d8 g8 ] d4 |
%7
- [ c `b `a `g ] [ `fis `e `d `c ] |
+ [ c 'b 'a 'g ] [ 'fis 'e 'd 'c ] |
%8
- [ `d8. `e ] [ `d `fis `a c ] |
+ [ 'd8. 'e ] [ 'd 'fis 'a c ] |
%9=1
- [ `b8. `a ] [ `g8 `b c ] |
+ [ 'b8. 'a ] [ 'g8 'b c ] |
%10
- [ d8 `d8 ] d4 |
+ [ d8 'd8 ] d4 |
%11=4
- [ c `b `a `b ] `b4 |
+ [ c 'b 'a 'b ] 'b4 |
%12
- [ `a8 d8 ] `b4 |
+ [ 'a8 d8 ] 'b4 |
%13
- [ d8. c ] [ `b8 `a `g ] |
+ [ d8. c ] [ 'b8 'a 'g ] |
%14=10
- [ d8 `d8 ] d4 |
+ [ d8 'd8 ] d4 |
%15
[ e8 fis8 ] [ g8 d8 ] |
%16
\textstyle "italic"
- [ c `a `fis `d ] `g4_"fine" |
+ [ c 'a 'fis 'd ] 'g4_"fine" |
\textstyle "roman"
% \scoreverb{\mulooseness=-1}
% \newline
%17
%=1
- [ `b8. `a ] [ `g8 `b c ] |
+ [ 'b8. 'a ] [ 'g8 'b c ] |
%18=2
[ d8 g8 ] d4 |
%19=3
[ e fis g a ] d4 |
%20=4
- [ c `b `a `b ] `b4 |
+ [ c 'b 'a 'b ] 'b4 |
%21=5=1
- [ `b8. `a ] [ `g8 `b c ] |
+ [ 'b8. 'a ] [ 'g8 'b c ] |
%22=6=2
[ d8 g8 ] d4 |
%23=20=4
- [ c `b `a `b ] `b4 |
+ [ c 'b 'a 'b ] 'b4 |
%24
- [ `a8. `g ] [ `a cis e g ] |
+ [ 'a8. 'g ] [ 'a cis e g ] |
%first modulation
%25
[ fis8. e ] [ d8 fis g ] |
%26
- [ a8 `a8 ] a4 |
+ [ a8 'a8 ] a4 |
%27
[ g fis e fis ] fis4 |
%28
%29
[ a8. g ] [ fis8 e d ] |
%30
- [ a8 `a8 ] a4 |
+ [ a8 'a8 ] a4 |
%31
[ b8 cis'8 ] [ d'8 a8 ] |
%32
- [ g e cis `a ] d4 |
+ [ g e cis 'a ] d4 |
%variant a
%33
- [ `b8 `g `g ] [ `g8 `b c ] |
+ [ 'b8 'g 'g ] [ 'g8 'b c ] |
%34
- [ d8 `g `g ] `g4 |
+ [ d8 'g 'g ] 'g4 |
%35
- [ e8 `g `g ] [ `g8 e fis ] |
+ [ e8 'g 'g ] [ 'g8 e fis ] |
%36
[ g8. fis32 e32 ] d4 |
%37
- [ e8 c c ] [ c8 `b `a ] |
+ [ e8 c c ] [ c8 'b 'a ] |
%38
- [ d8 `b `b ] [ `b8 `a `g ] |
+ [ d8 'b 'b ] [ 'b8 'a 'g ] |
%39
- [ c8 `a `a ] [ `a8 `b `a ] |
+ [ c8 'a 'a ] [ 'a8 'b 'a ] |
%40
- `a4 `g4 |
+ 'a4 'g4 |
%41
- [ `g8 `a `g ] [ d8 e d ] |
+ [ 'g8 'a 'g ] [ d8 e d ] |
%42
- [ `g8 `a `g ] [ g8 e8 ] |
+ [ 'g8 'a 'g ] [ g8 e8 ] |
%43
- [ d8 e d ] [ d8 c `b ] |
+ [ d8 e d ] [ d8 c 'b ] |
%44
- [ `b8. c32 `b32 ] `a4 |
+ [ 'b8. c32 'b32 ] 'a4 |
%45
- [ `g `a `g `a `g `a ]4/6 [ `g `b c d e fis ]4/6 |
+ [ 'g 'a 'g 'a 'g 'a ]4/6 [ 'g 'b c d e fis ]4/6 |
%46
- [ g fis e d `b `g ]4/6 [ `a8 `g8 ] |
+ [ g fis e d 'b 'g ]4/6 [ 'a8 'g8 ] |
%47
- [ g fis e d c `b ]4/6 [ e d c `b `a `g ]4/6 |
+ [ g fis e d c 'b ]4/6 [ e d c 'b 'a 'g ]4/6 |
%48
- [ d e d d `b `g ]4/6 [ `a8 `g8 ] |
+ [ d e d d 'b 'g ]4/6 [ 'a8 'g8 ] |
%theme 2
\duration{8}
%49
%50
[ e d c ]2/3 e4 |
%51
- [ d g `g ]2/3 [ `g `a `b ]2/3 |
+ [ d g 'g ]2/3 [ 'g 'a 'b ]2/3 |
%52
d4 e4 |
%53
%54
[ e d c ]2/3 e4 |
%55
- [ d g `g ]2/3 [ `g `a `b ]2/3 |
+ [ d g 'g ]2/3 [ 'g 'a 'b ]2/3 |
%56
- `b4 c4 \key{bes es as} | % || \key\Es
+ 'b4 c4 \key{bes es as} | % || \key\Es
%57
- [ `b d ] [ `g `b ] |
+ [ 'b d ] [ 'g 'b ] |
%58
- [ c es ] [ `g c ] |
+ [ c es ] [ 'g c ] |
%59
- [ d f ] [ `g f ] |
+ [ d f ] [ 'g f ] |
%60
[ es16 d16 es16 f16 ] g4 |
%61
[ as f ] [ d as ] |
%62
- [ g es ] [ c `as ] |
+ [ g es ] [ c 'as ] |
%63
- [ `g `b ] [ es d ] |
+ [ 'g 'b ] [ es d ] |
%64
- [ c8. `g32 `es32 ] `c4 | % || \meter{6/8}
+ [ c8. 'g32 'es32 ] 'c4 | % || \meter{6/8}
%65
es4.( [ )es d c ] |
%66
es2. |
%67
- d4.( [ )d c `b ] |
+ d4.( [ )d c 'b ] |
%68
d2. |
%69
c r4 r4. | % || \meter{2/4}
%73
\duration{8}
- [ `b d ] [ `g `b ] |
+ [ 'b d ] [ 'g 'b ] |
%74
- [ c es ] [ `g c ] |
+ [ c es ] [ 'g c ] |
%75
- [ d f ] [ `g f ] |
+ [ d f ] [ 'g f ] |
%76
[ es16 d16 es16 f16 ] g4 |
%77
[ as f ] [ d as ] |
%78
- [ g es ] [ c `as ] |
+ [ g es ] [ c 'as ] |
%79
- [ `g `b ] [ es d ] |
+ [ 'g 'b ] [ es d ] |
%80
- [ c8. `g32 `es32 ] `c4 |
+ [ c8. 'g32 'es32 ] 'c4 |
%81
g4 [ as g ] |
%82
%84
[ as g f g ] as4 |
%85
- f4 [ f des c `bes ] |
+ f4 [ f des c 'bes ] |
%86
- `a2 |
+ 'a2 |
%87
- `b2 |
+ 'b2 |
%88
\textstyle "italic"
c2_"dacapo" \key{fis} |
%
cello = \music {
-\clef"bass" \octave{`}
+\clef"bass" \octave{'}
\duration{4}
\key{fis}
%%1
- g `g |
+ g 'g |
%%2
- [ `g8. `a16 ] ``b |
+ [ 'g8. 'a16 ] ''b |
%%3
c d |
%%4
%%5=1
e2 |
%%6=2
- [ `g8. `a16 ] ``b |
+ [ 'g8. 'a16 ] ''b |
%%7
c d |
%%8
- `g d |
+ 'g d |
%%9=1
- `g2 |
+ 'g2 |
%%10
- `g ``b |
+ 'g ''b |
%%11=4
e [ g16 fis16 e16 d16( ] |
%%12
%%14=10
[ d8 d'8 ] g |
%%15
- [ c8 e8 ] [ g8 `g8 ] |
+ [ c8 e8 ] [ g8 'g8 ] |
%%16
\textstyle "italic"
[ d8 c'8 ] b_"fine"
\textstyle "roman" |
% \newline
%%17=1
- g `g |
+ g 'g |
%%18=2
- [ `g8. `a16 ] ``b |
+ [ 'g8. 'a16 ] ''b |
%%19=3
c d |
%%20=4
%%21=5=1
e2 |
%%22=6=2
- [ `g8. `a16 ] ``b |
+ [ 'g8. 'a16 ] ''b |
%%23=4
c g |
%%24
- a `a |
+ a 'a |
%%25
d2 |
%%first modulation
%%26
- d `fis |
+ d 'fis |
%%27
- ``b [ dis16 c16 ``b16 `a16( ] |
+ ''b [ dis16 c16 ''b16 'a16( ] |
%%28
- ) `a d |
+ ) 'a d |
%%29
\duration{8}
- [ `a a ] d4 |
+ [ 'a a ] d4 |
%%30
- [ `a a ] d4 |
+ [ 'a a ] d4 |
%%31
- [ `g ``b ] [ d `d ] |
+ [ 'g ''b ] [ d 'd ] |
%%32
- [ `a a ] d4 |
+ [ 'a a ] d4 |
%%variant a
%%33
\duration{16}
- [ `g8 `g `g ] [ `g8 `g `g ] |
+ [ 'g8 'g 'g ] [ 'g8 'g 'g ] |
%%34
- [ `g8 `g `g ] g4 |
+ [ 'g8 'g 'g ] g4 |
%%35
[ c8 c c ] [ c8 c' c' ] |
%%36
g4 b4 |
%%37
- [ a8 a a ] [ `a8 `a `a ] |
+ [ a8 a a ] [ 'a8 'a 'a ] |
%%38
- [ ``b8 ``b ``b ] [ ``b8 ``b ``b ] |
+ [ ''b8 ''b ''b ] [ ''b8 ''b ''b ] |
%%39
- [ `a8 `a `a ] [ `a8 `a `a ] |
+ [ 'a8 'a 'a ] [ 'a8 'a 'a ] |
%%40
- `d4 `g4 |
+ 'd4 'g4 |
%%41
\duration{8}
\textstyle "italic"
r_"pizz"
\textstyle "roman"
- g r `g |
+ g r 'g |
%%42
r g e4 |
%%43
- r b r ``b |
+ r b r ''b |
%%44
r e a4 |
%%45
r e r e |
%%46
- r ``b [ d g ] |
+ r ''b [ d g ] |
%%47
- r e r `a |
+ r e r 'a |
%%48
- r ``b
- [ `d `g ] |
+ r ''b
+ [ 'd 'g ] |
%%theme 2
%%49
\textstyle "italic"
r4_"arco"
- [ `g `g `g ]2/3 |
+ [ 'g 'g 'g ]2/3 |
\textstyle "roman"
%%50
r4 [ c c c ]2/3 |
%%52
c2 |
%%53
- r4 [ `g `g `g ]2/3 |
+ r4 [ 'g 'g 'g ]2/3 |
%%54
r4 [ c c c ]2/3 |
%%55
g2 |
%%56
- `g4 `c4 \key{bes es as}|
-% \key\`es ||
+ 'g4 'c4 \key{bes es as}|
+% \key\'es ||
%%57
g r g r |
%%58
c r c r |
%%59
- `g r `g r |
+ 'g r 'g r |
%%60
c r c r |
%%61
- d4. ``b |
+ d4. ''b |
%%62
c2 |
%%63
- g4 `g4 |
+ g4 'g4 |
%%64
- c4 `c4 |
+ c4 'c4 |
% \meter{6/8} ||
%%65
[ c c c ] c4. |
%%66
- [ `c `c `c ] `c4. |
+ [ 'c 'c 'c ] 'c4. |
%%67
- [ `g `g `g ] `g4. |
+ [ 'g 'g 'g ] 'g4. |
% \newline
%%68
[ g g g ] g4. |
%%74
c r c r |
%%75
- `g r `g r |
+ 'g r 'g r |
%%76
c r c4 |
%%77
- d4. ``b |
+ d4. ''b |
%%78
c2 |
%%79
- g4 `g4 |
+ g4 'g4 |
%%80
- c4 `c4 |
+ c4 'c4 |
%%81
\duration{2}
- `c |
+ 'c |
%%82
- `c |
+ 'c |
%%83
- `e |
+ 'e |
%%84
- `f |
+ 'f |
%%85
- `as |
+ 'as |
%%86
c |
%%87
\textstyle "italic"
d_"dacapo" \key{fis} |
\textstyle "roman"
-% \key\`g ||
+% \key\'g ||
}
%22=6
g2 |
%23=4
- e [ d16 c16 `b16 c16 ] |
+ e [ d16 c16 'b16 c16 ] |
%24
cis cis' |
%25
c' r c'4 |
%61
\duration{16}
- [ as f d f as d' ]4/6 [ as f d `as d f ]4/6 |
+ [ as f d f as d' ]4/6 [ as f d 'as d f ]4/6 |
%62
- [ g es c `g c es ]4/6 [ g c' es' c' g es ]4/6 |
+ [ g es c 'g c es ]4/6 [ g c' es' c' g es ]4/6 |
%63
[ g d g bes d' g' ]4/6 [ f' d' bes g f d ]4/6 |
%64
c' r c'4 |
%77
\duration{16}
- [ as f d f as d' ]4/6 [ as f d `as d f ]4/6 |
+ [ as f d f as d' ]4/6 [ as f d 'as d f ]4/6 |
%78
- [ g es c `g c es ]4/6 [ f c' es' c' g es ]4/6 |
+ [ g es c 'g c es ]4/6 [ f c' es' c' g es ]4/6 |
%79
[ g d f b d' g' ]4/6 [ f' d' b g f d ]4/6 |
%80
%1
d2 |
%2
- [ `b8. `a16 ] `g4 |
+ [ 'b8. 'a16 ] 'g4 |
%3
[ g8 e8 ] fis |
%4
%5=1
e2 |
%6=2
- [ `b8. `a16 ] `g4 |
+ [ 'b8. 'a16 ] 'g4 |
%7
- `g `a |
+ 'g 'a |
%8
- `b `a |
+ 'b 'a |
%9=1
d2 |
%10
- `b `g |
+ 'b 'g |
%11=4
- `g2 |
+ 'g2 |
%12
[ d8 e16 fis16 ] g |
%13
%17=1
d2 |
%18=2
- [ `b8. `a16 ] `g4 |
+ [ 'b8. 'a16 ] 'g4 |
%19=3
[ g8 e8 ] fis |
%20=4
%21=5=1
e2 |
%22=6=2
- [ `b8. `a16 ] `g4 |
+ [ 'b8. 'a16 ] 'g4 |
%23=4
- `g2 |
+ 'g2 |
%24
cis e |
%25
\textstyle "italic"
r_"pizz"
\textstyle "roman"
- `b r `b |
+ 'b r 'b |
%42
- r `b `g4 |
+ r 'b 'g4 |
%43
r fis r fis |
%44
f4 e4 \key{bes es as}|
% \key\Es ||
%57
- d r `b r |
+ d r 'b r |
%58
- `g r es r |
+ 'g r es r |
%59
g r g r |
%60
%62
es2 |
%63
- `b d4. |
+ 'b d4. |
%64
es2 |
% \meter{6/8} ||
\duration{8}
[ c c c ] c4. |
%66
- [ `g `g `g ] `g4. |
+ [ 'g 'g 'g ] 'g4. |
%67
- [ `b8 `b `b ] `b4. |
+ [ 'b8 'b 'b ] 'b4. |
%68
[ g g g ] g4. |
%69
es r4 r4. |
%73
% \meter{2/4} ||
- d r `b r |
+ d r 'b r |
%74
- `g r es r |
+ 'g r es r |
%75
g r g r |
%76
%78
es |
%79
- `b8 d4. |
+ 'b8 d4. |
%80
es |
%81
b16 d16 f16 b16 } } { \music{ d16 f16 b16 d16 f16
b16 } } { \music{ c16 g16 c'16 c16 g16 c'16 } } {
\music{ c16 g16 c'16 c16 g16 c'16 } } { \music{
- `a16 c16 f16 `a16 c16 f16 } } { \music{ `a16 c16
- f16 `a16 c16 f16 } } { \music{ `a16 c16 f16 `a16
- c16 f16 } } { \music{ `a16 c16 f16 `a16 c16 f16 } }
- { \music{ `g16 `b16 f16 `g16 `b16 f16 } } { \music{
- `g16 `b16 f16 `g16 `b16 f16 } } { \music{ `g16 c16
- e16 `g16 c16 e16 } } { \music{ `g16 c16 e16 `g16
- c16 e16 } } { \music{ `ais16 c16 e16 `ais16 c16 e16
- } } { \music{ `ais16 c16 e16 `ais16 c16 e16 } } {
- \music{ `a16 c16 e16 `a16 c16 e16 } } { \music{
- `a16 c16 e16 `a16 c16 e16 } } { \music{ `a16 c16
- dis16 `a16 c16 dis16 } } { \music{ `a16 c16 dis16
- `a16 c16 dis16 } } { \music{ `b16 c16 d16 `b16 c16
- d16 } } { \music{ `b16 c16 d16 `b16 c16 d16 } } {
- \music{ `g16 `b16 d16 `g16 `b16 d16 } } { \music{
- `g16 `b16 d16 `g16 `b16 d16 } } { \music{ `g16 c16
- e16 `g16 c16 e16 } } { \music{ `g16 c16 e16 `g16
- c16 e16 } } { \music{ `g16 c16 f16 `g16 c16 f16 } }
- { \music{ `g16 c16 f16 `g16 c16 f16 } } { \music{
- `g16 `b16 f16 `g16 `b16 f16 } } { \music{ `g16 `b16
- f16 `g16 `b16 f16 } } { \music{ `a16 c16 fis16 `a16
- c16 fis16 } } { \music{ `a16 c16 fis16 `a16 c16
- fis16 } } { \music{ `g16 c16 g16 `g16 c16 g16 } } {
- \music{ `g16 c16 g16 `g16 c16 g16 } } { \music{
- `g16 c16 f16 `g16 c16 f16 } } { \music{ `g16 c16
- f16 `g16 c16 f16 } } { \music{ `g16 `b16 f16 `g16
- `b16 f16 } } { \music{ `g16 `b16 f16 `g16 `b16 f16 }
- } { \music{ `g16 `ais16 e16 `g16 `ais16 e16 } } {
- \music{ `g16 `ais16 e16 `g16 `ais16 e16 } } {
- \music{ `f16 `a16 c16 f16 c16 `a16 c16 `a16 `f16
- `a16 `f16 `d16 `f16 `d16 } } { \music{ g16 b16 d'16
+ 'a16 c16 f16 'a16 c16 f16 } } { \music{ 'a16 c16
+ f16 'a16 c16 f16 } } { \music{ 'a16 c16 f16 'a16
+ c16 f16 } } { \music{ 'a16 c16 f16 'a16 c16 f16 } }
+ { \music{ 'g16 'b16 f16 'g16 'b16 f16 } } { \music{
+ 'g16 'b16 f16 'g16 'b16 f16 } } { \music{ 'g16 c16
+ e16 'g16 c16 e16 } } { \music{ 'g16 c16 e16 'g16
+ c16 e16 } } { \music{ 'ais16 c16 e16 'ais16 c16 e16
+ } } { \music{ 'ais16 c16 e16 'ais16 c16 e16 } } {
+ \music{ 'a16 c16 e16 'a16 c16 e16 } } { \music{
+ 'a16 c16 e16 'a16 c16 e16 } } { \music{ 'a16 c16
+ dis16 'a16 c16 dis16 } } { \music{ 'a16 c16 dis16
+ 'a16 c16 dis16 } } { \music{ 'b16 c16 d16 'b16 c16
+ d16 } } { \music{ 'b16 c16 d16 'b16 c16 d16 } } {
+ \music{ 'g16 'b16 d16 'g16 'b16 d16 } } { \music{
+ 'g16 'b16 d16 'g16 'b16 d16 } } { \music{ 'g16 c16
+ e16 'g16 c16 e16 } } { \music{ 'g16 c16 e16 'g16
+ c16 e16 } } { \music{ 'g16 c16 f16 'g16 c16 f16 } }
+ { \music{ 'g16 c16 f16 'g16 c16 f16 } } { \music{
+ 'g16 'b16 f16 'g16 'b16 f16 } } { \music{ 'g16 'b16
+ f16 'g16 'b16 f16 } } { \music{ 'a16 c16 fis16 'a16
+ c16 fis16 } } { \music{ 'a16 c16 fis16 'a16 c16
+ fis16 } } { \music{ 'g16 c16 g16 'g16 c16 g16 } } {
+ \music{ 'g16 c16 g16 'g16 c16 g16 } } { \music{
+ 'g16 c16 f16 'g16 c16 f16 } } { \music{ 'g16 c16
+ f16 'g16 c16 f16 } } { \music{ 'g16 'b16 f16 'g16
+ 'b16 f16 } } { \music{ 'g16 'b16 f16 'g16 'b16 f16 }
+ } { \music{ 'g16 'ais16 e16 'g16 'ais16 e16 } } {
+ \music{ 'g16 'ais16 e16 'g16 'ais16 e16 } } {
+ \music{ 'f16 'a16 c16 f16 c16 'a16 c16 'a16 'f16
+ 'a16 'f16 'd16 'f16 'd16 } } { \music{ g16 b16 d'16
f'16 d'16 b16 d'16 b16 g16 b16 d16 f16 e64 } } {
\music{ f64 } } { } { \music{ e32 } } { \music{ d16
} } { \music{ c'1 } \music{ g1 } \music{ e1 } }
e4. } } { \music{ e4. } } { \music{ d4. } } {
\music{ d4. } } { \music{ d4. } } { \music{ d4. } }
{ \music{ c4. } } { \music{ c4. } } { \music{ c4. }
- } { \music{ c4. } } { \music{ `a4. } } { \music{
- `a4. } } { \music{ `b4. } } { \music{ `b4. } } {
- \music{ `ais4. } } { \music{ `ais4. } } { \music{
- `a4. } } { \music{ `a4. } } { \music{ `gis4. } } {
- \music{ `gis4. } } { \music{ `g4. } } { \music{
- `g4. } } { \music{ `f4. } } { \music{ `f4. } } {
- \music{ `f4. } } { \music{ `f4. } } { \music{ `d4. }
- } { \music{ `d4. } } { \music{ `e4. } } { \music{
- `e4. } } { \music{ `g4. } } { \music{ `c4. } } { } {
- } { \music{ `g4. } } { } { \music{ ``f4. } } {
- \music{ `f4. } } { \music{ ``f4. } } { \music{ `f4. }
- } { \music{ fi``s4. } } { \music{ fi``s4. } \music{
- `c4. } } { } { \music{ `c4. } } { \music{ gi``s4. } }
- { \music{ gi``s4. } \music{ `f4. } } { } { \music{
- `f4. } } { \music{ ``g4. } } { \music{ ``g4. } \music{
- `f4. } } { } { \music{ `f4. } } { \music{ ``g4. } }
- { \music{ ``g4. } \music{ `e4. } } { } { \music{ ``g4.
- } \music{ `e4. } } { } { \music{ ``g4. } \music{
- `d4. } } { } { \music{ ``g4. } \music{ `d4. } } { } {
- \music{ `d4. } } { \music{ ``g4. } } { \music{ ``g4. }
- \music{ `d4. } } { } { \music{ `dis4. } } { \music{
- ``g4. } } { \music{ `dis4. } } { \music{ ``g4. } } {
- \music{ `e4. } } { \music{ ``g4. } } { \music{ `e4. }
- } { \music{ ``g4. } } { \music{ `d4. } } { \music{
- ``g4. } } { \music{ `d4. } } { \music{ ``g4. } } {
- \music{ `d4. } } { \music{ ``g4. } } { \music{ `d4. }
- } { \music{ ``c4. } } { \music{ `c4. } } { \music{
- ``c4. } } { \music{ `c4. } } { \music{ ``c1 } } {
- \music{ `c1 } } { \music{ ``c1 } \music{ ``b1 } } {
- } { } { } { \music{ ``c1 } \music{ `c1 } }
+ } { \music{ c4. } } { \music{ 'a4. } } { \music{
+ 'a4. } } { \music{ 'b4. } } { \music{ 'b4. } } {
+ \music{ 'ais4. } } { \music{ 'ais4. } } { \music{
+ 'a4. } } { \music{ 'a4. } } { \music{ 'gis4. } } {
+ \music{ 'gis4. } } { \music{ 'g4. } } { \music{
+ 'g4. } } { \music{ 'f4. } } { \music{ 'f4. } } {
+ \music{ 'f4. } } { \music{ 'f4. } } { \music{ 'd4. }
+ } { \music{ 'd4. } } { \music{ 'e4. } } { \music{
+ 'e4. } } { \music{ 'g4. } } { \music{ 'c4. } } { } {
+ } { \music{ 'g4. } } { } { \music{ ''f4. } } {
+ \music{ 'f4. } } { \music{ ''f4. } } { \music{ 'f4. }
+ } { \music{ fi''s4. } } { \music{ fi''s4. } \music{
+ 'c4. } } { } { \music{ 'c4. } } { \music{ gi''s4. } }
+ { \music{ gi''s4. } \music{ 'f4. } } { } { \music{
+ 'f4. } } { \music{ ''g4. } } { \music{ ''g4. } \music{
+ 'f4. } } { } { \music{ 'f4. } } { \music{ ''g4. } }
+ { \music{ ''g4. } \music{ 'e4. } } { } { \music{ ''g4.
+ } \music{ 'e4. } } { } { \music{ ''g4. } \music{
+ 'd4. } } { } { \music{ ''g4. } \music{ 'd4. } } { } {
+ \music{ 'd4. } } { \music{ ''g4. } } { \music{ ''g4. }
+ \music{ 'd4. } } { } { \music{ 'dis4. } } { \music{
+ ''g4. } } { \music{ 'dis4. } } { \music{ ''g4. } } {
+ \music{ 'e4. } } { \music{ ''g4. } } { \music{ 'e4. }
+ } { \music{ ''g4. } } { \music{ 'd4. } } { \music{
+ ''g4. } } { \music{ 'd4. } } { \music{ ''g4. } } {
+ \music{ 'd4. } } { \music{ ''g4. } } { \music{ 'd4. }
+ } { \music{ ''c4. } } { \music{ 'c4. } } { \music{
+ ''c4. } } { \music{ 'c4. } } { \music{ ''c1 } } {
+ \music{ 'c1 } } { \music{ ''c1 } \music{ ''b1 } } {
+ } { } { } { \music{ ''c1 } \music{ 'c1 } }
} % track4.
score {
\duration { 8 }
\octave{ }
|[ a a a a a a a a a ]6/9
- \octave{ ' }
+ \octave{ 1 }
|[ a a a a a a a a a ]6/9
- \octave { ` }
- [ `c `g d a e' b' f'' c''' g''' ]6/9
- [ g''' c''' f'' b' e' a d `g `c ]6/9
- \octave{ ' }
- [ `c `g d a e' b' f'' c''' g''' ]6/9
- [ g''' c''' f'' b' e' a d `g `c ]6/9
+ \octave { ' }
+ [ 'c 'g d a e' b' f'' c''' g''' ]6/9
+ [ g''' c''' f'' b' e' a d 'g 'c ]6/9
+ \octave{ 1 }
+ [ 'c 'g d a e' b' f'' c''' g''' ]6/9
+ [ g''' c''' f'' b' e' a d 'g 'c ]6/9
\octave { }
[ c g d' ]2/3
[ d' g c ]2/3
[ f c' g' ]2/3
[ g' c' f ]2/3
- \octave{ ' }
+ \octave{ 1 }
[ c g d' ]2/3
[ d' g c ]2/3
[ f c' g' ]2/3
[c d e f][g a b c'] % 10
|[c' b a g][f e d c]
- }
+ }
}
\score {
ii_menuetto = \music {
\clef"alto"\meter{3/4}
\key {bes}
- \octave{}
+ \octave{1}
\duration{8}
< a2 f2 d2 df > bes4-. |
%%2
< [ bes^"1" e c_"2"_"4" >
a bes-. g-. ] a4-.^"4" |
%%3
- < d4 `bes4-. > g4-. [ f-. e-. ] |
+ < d4 'bes4-. > g4-. [ f-. e-. ] |
%%4
- < [ f `a > e d cis-. `b-. `a-. ]
+ < [ f 'a > e d cis-. 'b-. 'a-. ]
%%5
< a2 f2 d2 > bes4-. | % @bes4-. |
%%6
c'4-. | % =c'4-. |
%%7
< a4-. f4>
- < d'4-.-upbow f4 `bes4 >
- < e'4-.-downbow g4 `g4 > |
+ < d'4-.-upbow f4 'bes4 >
+ < e'4-.-downbow g4 'g4 > |
%%8
- < cis'2.-upbow e2. `a2. > \bar ":|:"%%!! sorry!
+ < cis'2.-upbow e2. 'a2. > \bar ":|:"%%!! sorry!
%%9
\clef "violin"
< e'2 a2 df >
{ \stem{-1} g4(\stem{-1}) f4 e4 }% ugh
> |
%%14
- < [ a f > g a f ] < d'4-upbow e4 `bes4 > |
+ < [ a f > g a f ] < d'4-upbow e4 'bes4 > |
%%15
- < c'4-\downbow f4 `a4 > [ bes( )a g a ] |
+ < c'4-\downbow f4 'a4 > [ bes( )a g a ] |
%%16
[ f( e )f a-. g-. bes-. ] |
%%17
%%18
< { [ c'( )bes c' a ] } { [ es ] } > fis4 |
%%19
- < d'4-downbow g4 `bes4 > < c'4-upbow g4 c4 > < [ bes d > a ] |
+ < d'4-downbow g4 'bes4 > < c'4-upbow g4 c4 > < [ bes d > a ] |
%%20
< { [ c'( bes a )bes g( )bes ] } { [ d ] } { [ g ] } > |
%%21
%%22
< { [ g( )f g e ] } { [ cis ] } > < f4 d4 > |
%%23
- [ `g g ] < e4. `a4. > d-upbow |
+ [ 'g g ] < e4. 'a4. > d-upbow |
%%24
- < d2.^"fine" `a2. `d2._"3 mins."> \bar ":|" % \bar ":||"
+ < d2.^"fine" 'a2. 'd2._"3 mins."> \bar ":|" % \bar ":||"
%% \tighten % use one line less
}
% (except for grace notes) are printed
%
%%1
-melodie = \music { \clef\violin
+melodie = \music { \clef\violin\octave{1}
\key{bes}
\meter{3/4}\duration{ 8 }
- r pp < [ d `a-| > f-| < d `a-| > f-| < d `a-| ] > |
+ r pp < [ d 'a-| > f-| < d 'a-| > f-| < d 'a-| ] > |
%%2
- r < [ d `bes-| > f-| < d `bes-| > f-| < d `bes-| ] > |
+ r < [ d 'bes-| > f-| < d 'bes-| > f-| < d 'bes-| ] > |
%%3
\textstyle "italic"
- r_"simile" < [ d `bes > e < d `bes > e < d `bes ] >
+ r_"simile" < [ d 'bes > e < d 'bes > e < d 'bes ] >
\textstyle "roman" |
%%4
- r < [ `a cis > e < `a cis > e < `a cis ] > |
+ r < [ 'a cis > e < 'a cis > e < 'a cis ] > |
%#%:|
%%5
[ a()bes a ]2/3 d'4. a |
\key{bes}\meter{3/4}
\clef\bass
\duration{2}
- `d r4 |
+ 'd r4 |
%%2
- ``bes r4 |
+ ''bes r4 |
%%3
- ``g r4 |
+ ''g r4 |
%%4
- ``a r4 |
+ ''a r4 |
%#%:|
%%5
\duration{ 8 }
- < \multivoice { \stem{ 1 } [ `f `a d `a d `a ] }
- { \stem{ -1 } `d2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'f 'a d 'a d 'a ] }
+ { \stem{ -1 } 'd2 r4 } > |
%%6
- < \multivoice { \stem{ 1 } [ `d `e `g `e `g `e ] }
- { \stem{ -1 } ``bes2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'd 'e 'g 'e 'g 'e ] }
+ { \stem{ -1 } ''bes2 r4 } > |
%%7
- < \multivoice { \stem{ 1 } [ `cis `e `g `e `g e ] }
- { \stem{ -1 } ``a2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'cis 'e 'g 'e 'g e ] }
+ { \stem{ -1 } ''a2 r4 } > |
%%8
- < \multivoice { \stem{ 1 } [ `d `a d `a d `a ] }
- { \stem{ -1 } `d2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'd 'a d 'a d 'a ] }
+ { \stem{ -1 } 'd2 r4 } > |
%%9
- [ `a e g e g e ] |
+ [ 'a e g e g e ] |
%%10
- [ `d `a d `a d `a ] |
+ [ 'd 'a d 'a d 'a ] |
%%11
- < \multivoice { \stem{ 1 } [ `f `a d `a d `a ] }
- { \stem{ -1 } `d2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'f 'a d 'a d 'a ] }
+ { \stem{ -1 } 'd2 r4 } > |
%%12 == 6
- < \multivoice { \stem{ 1 } [ `d `e `g `e `g `e ] }
- { \stem{ -1 } ``bes2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'd 'e 'g 'e 'g 'e ] }
+ { \stem{ -1 } ''bes2 r4 } > |
%13
- < \multivoice { [ `e `g `bes `g `bes `g ] }
- { \stem{ -1 } `c2 r4 } > |
+ < \multivoice { [ 'e 'g 'bes 'g 'bes 'g ] }
+ { \stem{ -1 } 'c2 r4 } > |
%%14
- < \multivoice { \stem{ 1 } [ `a c f c f c ] }
- { \stem{ -1 } `f2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'a c f c f c ] }
+ { \stem{ -1 } 'f2 r4 } > |
%%15
- [ `c `g `bes `g `bes `g ] |
+ [ 'c 'g 'bes 'g 'bes 'g ] |
%%16
- [ ``f `c `f `c `f `c ] |
+ [ ''f 'c 'f 'c 'f 'c ] |
%%17
- < \multivoice { \stem{ 1 } [ ``a `e `g `e `g `e ] }
- { \stem{ -1 } ``a2 r4 } > |
+ < \multivoice { \stem{ 1 } [ ''a 'e 'g 'e 'g 'e ] }
+ { \stem{ -1 } ''a2 r4 } > |
%%18
- < \multivoice { \stem{ 1 } [ `d `a d `a d `a ] }
- { \stem{ -1 } `d2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'd 'a d 'a d 'a ] }
+ { \stem{ -1 } 'd2 r4 } > |
%%19
- < \multivoice { \stem{ 1 } [ ``bes `f `bes `f `bes `f ] }
- { \stem{ -1 } ``bes2 r4 } > |
+ < \multivoice { \stem{ 1 } [ ''bes 'f 'bes 'f 'bes 'f ] }
+ { \stem{ -1 } ''bes2 r4 } > |
%%20
- < \multivoice { \stem{ 1 } [ ``f `c `f `c `f `c ] }
- { \stem{ -1 } ``f2 r4 } > |
+ < \multivoice { \stem{ 1 } [ ''f 'c 'f 'c 'f 'c ] }
+ { \stem{ -1 } ''f2 r4 } > |
%%21
- < [ `e `c > `g c `g c `g ] |
+ < [ 'e 'c > 'g c 'g c 'g ] |
%%22
- [ `f `a c `a `f `c ] |
+ [ 'f 'a c 'a 'f 'c ] |
%%23
- < \multivoice { \stem{ 1 } [ ``a `e `g `e `g `e ] }
- { \stem{ -1 } ``a2 r4 } > |
+ < \multivoice { \stem{ 1 } [ ''a 'e 'g 'e 'g 'e ] }
+ { \stem{ -1 } ''a2 r4 } > |
%%24
- < \multivoice { \stem{ 1 } [ `d `fis `a `fis `a `fis ] }
- { \stem{ -1 } `d2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'd 'fis 'a 'fis 'a 'fis ] }
+ { \stem{ -1 } 'd2 r4 } > |
%%25
- < \multivoice { \stem{ 1 } [ ``g `d `b `d `b `d ] }
- { \stem{ -1 } ``g2 r4 } > |
+ < \multivoice { \stem{ 1 } [ ''g 'd 'b 'd 'b 'd ] }
+ { \stem{ -1 } ''g2 r4 } > |
%%26
- < \multivoice { \stem{ 1 } [ `d `a d `a d `a ] }
- { \stem{ -1 } `d2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'd 'a d 'a d 'a ] }
+ { \stem{ -1 } 'd2 r4 } > |
%%27
- < [ `cis ``a > `e `a `e `a `e ] |
+ < [ 'cis ''a > 'e 'a 'e 'a 'e ] |
%%28
- [ `d `a d `a d `a ] |
+ [ 'd 'a d 'a d 'a ] |
%%29
- [ `d `g `bes `g `bes `g ] |
+ [ 'd 'g 'bes 'g 'bes 'g ] |
%#%\volta1
%%30
- [ `d `fis `a `fis `a `fis ] |
+ [ 'd 'fis 'a 'fis 'a 'fis ] |
%%31
- [ ``a `e `a `e `a `e ] |
+ [ ''a 'e 'a 'e 'a 'e ] |
%%32
- [ `d `fis `a `fis `a `fis ] |
+ [ 'd 'fis 'a 'fis 'a 'fis ] |
%%33
- [ `d `g `b `g `b `g ] |
+ [ 'd 'g 'b 'g 'b 'g ] |
%%34
- [ `d `fis `a `fis `a `fis ] |
+ [ 'd 'fis 'a 'fis 'a 'fis ] |
%%35
- [ ``a `e `a `e `a `e ] |
+ [ ''a 'e 'a 'e 'a 'e ] |
%%36
- [ `d `fis `a `fis `a `fis ] |
+ [ 'd 'fis 'a 'fis 'a 'fis ] |
%#%\volta2
%#%:|
%%37
- [ ``a `e `g `e ``bes^> `e ] |
+ [ ''a 'e 'g 'e ''bes^> 'e ] |
%%38
- [ ``a < e cis `a > < e cis `a > < e cis `a > < e cis `a > < e cis `a ] > |
+ [ ''a < e cis 'a > < e cis 'a > < e cis 'a > < e cis 'a > < e cis 'a ] > |
%%39
- [ ``a `e `g `e ``bes^> `e ] |
+ [ ''a 'e 'g 'e ''bes^> 'e ] |
%%40
- [ ``a < e cis `a > < e cis `a > < e cis `a > < e cis `a > < e cis `a ] > |
+ [ ''a < e cis 'a > < e cis 'a > < e cis 'a > < e cis 'a > < e cis 'a ] > |
%%41
- [ ``ais `e `fis `e `fis `e ] |
+ [ ''ais 'e 'fis 'e 'fis 'e ] |
%%42
- < [ `d ``b > `fis `b `fis `b `fis ] |
+ < [ 'd ''b > 'fis 'b 'fis 'b 'fis ] |
%%43
- < [ `e ``b > `g `b `g `b `g ] |
+ < [ 'e ''b > 'g 'b 'g 'b 'g ] |
%%44
- < [ `d ``b > `fis `b `fis `b `fis ] |
+ < [ 'd ''b > 'fis 'b 'fis 'b 'fis ] |
%%45
- < \multivoice { \stem{ 1 } [ ``g `d `b `d `b `d ] }
- { \stem{ -1 } ``g2 r4 } > |
+ < \multivoice { \stem{ 1 } [ ''g 'd 'b 'd 'b 'd ] }
+ { \stem{ -1 } ''g2 r4 } > |
%%46
- < \multivoice { \stem{ 1 } [ `d `a d `a d `a ] }
- { \stem{ -1 } `d2 r4 } > |
+ < \multivoice { \stem{ 1 } [ 'd 'a d 'a d 'a ] }
+ { \stem{ -1 } 'd2 r4 } > |
%%47
- < [ `cis ``a > `e `a `e `a `e ] |
+ < [ 'cis ''a > 'e 'a 'e 'a 'e ] |
%%48
- [ `d `fis `a `fis `a `fis ] |
+ [ 'd 'fis 'a 'fis 'a 'fis ] |
%%49
- [ `d `a d `a d `a ] |
+ [ 'd 'a d 'a d 'a ] |
%%50
- [ ``g `e `g `e `g `e ] |
+ [ ''g 'e 'g 'e 'g 'e ] |
%%51
- [ ``a `e `g `e `g `e ] |
+ [ ''a 'e 'g 'e 'g 'e ] |
%%52
- [ ``d `d `fis `d `fis `d ] |
+ [ ''d 'd 'fis 'd 'fis 'd ] |
%%53
- [ `d `g `bes `g `bes `g ] |
+ [ 'd 'g 'bes 'g 'bes 'g ] |
%%54
- [ `d `fis `a `fis `a `fis ] |
+ [ 'd 'fis 'a 'fis 'a 'fis ] |
%%55
- [ ``a `e `g `e `g `e ] |
+ [ ''a 'e 'g 'e 'g 'e ] |
%%56
- [ ``d ``a `d ``a `d ``a ] |
+ [ ''d ''a 'd ''a 'd ''a ] |
%%57
- [ ``d ``a `d ``a `d ``a ]
+ [ ''d ''a 'd ''a 'd ''a ]
%%58
- < `d2.^\fermata ``d2. > |
+ < 'd2.^\fermata ''d2. > |
}
\music { tekstI }
\music { tekstII }
}
-% Setting up music ...lilypond: ../flower/include/cursor.inl:98: class Cursor<void *> Cursor<void *>::operator ++(int): Assertion `pointer_' failed.
+% Setting up music ...lilypond: ../flower/include/cursor.inl:98: class Cursor<void *> Cursor<void *>::operator ++(int): Assertion 'pointer_' failed.
%IOT trap/Abort
% als geen music in staff
\staff {
melodie = \music {
\clef\violin
- c c | g g | a a | g g |
+ c4 c | g g | a a | g g |
f f | e e | d d8.( e16 | )c2 | % :|
g g | f f | e e | d d |
begeleiding = \music {
\clef \bass
- \octave{`}
+ \octave{-1}
c c' | e' c' | f' c' | e' c' |
d' b | c' a | f g | c2 |
%
global=\music{\meter {4/4}
\grouping {2*2}
- \key {bes es as}}
+ \key {bes es as}
+
+}
dux = \music {
- \clef \violin
+ \clef \violin\octave{1}
\duration { \last }
-
- r8-"dux" \stem{-1}
+ \stem{-1}
+ r8-"dux"
[c'16 b] [c'8 g] [as c'16 b] [c'8 d'] |
[g c'16 b] [c'8 d'] [f16 g] as4 [g16 f] |
[es c' b a] [ g f es d] [c8 es' d' c'] |
}
comes = \music {
- \octave {'}
- r1 \stem{1}
- |
+ \octave {2}\stem{1}
+ r1 |
r1 |
r8-"comes" [g16 fis] [g8 c] [es g16 f] [g8 a]|
[d8 g16 fis] [g8 a] [c16 d] es4 [d16 c] |
- [`bes8 es16 d] [es8 `g8] [`as f16 es] [f8 `a]
- [`bes8 g16 f] [g8 `b] [c8 d16 es] f4( |
- [) f8 es16 d] [c16 `bes `as `g] [`f8 as g f]
- [es d es f] [`b c d `b] |
+ ['bes8 es16 d] [es8 'g8] ['as f16 es] [f8 'a]
+ ['bes8 g16 f] [g8 'b] [c8 d16 es] f4( |
+ [) f8 es16 d] [c16 'bes 'as 'g] ['f8 as g f]
+ [es d es f] ['b c d 'b] |
}
bassdux = \music {
\clef \bass
- \octave { }
+ \octave {1}
r1 |
r |
r |
if ( !in_b( pos_ch_c_l ) )
return "";
- char const* begin_ch_c_l = pos_ch_c_l - 8 >? ch_c_l();
- char const* end_ch_c_l = pos_ch_c_l + 7 <? ch_c_l() + length_off();
+ char const* begin_ch_c_l = pos_ch_c_l - 8 >? ch_C();
+ char const* end_ch_c_l = pos_ch_c_l + 7 <? ch_C() + length_off();
String pre_str( (Byte const*)begin_ch_c_l, pos_ch_c_l - begin_ch_c_l );
pre_str = String_convert::bin2hex_str( pre_str );
if ( !in_b( pos_ch_c_l ) )
return 0;
- return pos_ch_c_l - ch_c_l();
+ return pos_ch_c_l - ch_C();
}
--- /dev/null
+/*
+ duration-convert.cc -- implement
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+#include <assert.h>
+#include "duration-convert.hh"
+#include "debug.hh"
+
+// statics Duration_convert
+bool Duration_convert::be_blonde_b_s = false;
+bool Duration_convert::no_double_dots_b_s = false;
+bool Duration_convert::no_triplets_b_s = false;
+int Duration_convert::no_smaller_than_i_s = 0;
+
+String
+Duration_convert::dur2_str( Duration dur )
+{
+ if ( dur.ticks_i_ )
+ return String( "[" ) + String( dur.ticks_i_ ) + "]";
+
+ String str( dur.type_i_ );
+ str += String( '.', dur.dots_i_ );
+ if ( dur.plet_b())
+ str += String( "*" ) + String( dur.plet_.iso_i_ )
+ + String( "/" ) + String( dur.plet_.type_i_ );
+ return str;
+}
+
+#if 0
+int
+Duration_convert::dur2_i( Duration dur, int division_1_i )
+{
+ return dur2_mom( dur ) * Moment( division_1_i );
+}
+#endif
+
+int
+Duration_convert::dur2ticks_i( Duration dur )
+{
+ if ( dur.ticks_i_ )
+ return dur.ticks_i_;
+ return dur2_mom( dur ) * Moment( Duration::division_1_i_s );
+}
+
+Moment
+Duration_convert::dur2_mom( Duration dur )
+{
+ if ( dur.ticks_i_ )
+ return Moment( dur.ticks_i_, Duration::division_1_i_s );
+
+ // or simply assert?
+ if ( !dur.type_i_ )
+ return Moment( 0 );
+
+ Moment mom = Moment( 1 , dur.type_i_ );
+
+ Moment delta = mom;
+ while ( dur.dots_i_-- ) {
+ delta /= 2.0;
+ mom += delta;
+ }
+
+ return mom * plet_factor_mom( dur );
+}
+
+#if 0
+Moment
+Duration_convert::i2_mom( int time_i, int division_1_i )
+{
+ if ( !time_i )
+ return Moment( 0 );
+
+ if ( division_1_i > 0 )
+ return Moment( time_i, division_1_i );
+ else
+ return Moment( -division_1_i, time_i );
+}
+#endif
+
+#if 0
+Duration
+Duration_convert::mom2_dur( Moment mom )
+{
+ /* this is cute,
+ but filling an array using Duration_iterator
+ might speed things up, a little
+ */
+ Duration_iterator iter_dur;
+ assert( iter_dur );
+ while ( iter_dur ) {
+ Duration lower_dur = iter_dur++;
+ Duration upper_dur( 0 );
+ if ( iter_dur )
+ upper_dur = iter_dur();
+ Moment lower_mom = dur2_mom( lower_dur );
+ Moment upper_mom = dur2_mom( upper_dur );
+ if ( mom == lower_mom )
+ return lower_dur;
+ if ( mom == upper_mom ) // don-t miss last (sic)
+ return upper_dur;
+ if ( ( mom >= lower_mom ) && ( mom <= upper_mom ) ) {
+ warning( String( "duration not exact: " ) + String( (Real)mom ) , 0 );
+ if ( abs( mom - lower_mom ) < abs( mom - upper_mom ) )
+ return lower_dur;
+ else
+ return upper_dur;
+ }
+ lower_dur = upper_dur;
+ }
+ return Duration( 0 );
+}
+#endif
+
+Moment
+Duration_convert::plet_factor_mom( Duration dur )
+{
+ return dur.plet_.mom();
+}
+
+Real
+Duration_convert::sync_f( Duration dur, Moment mom )
+{
+ return mom / dur2_mom( dur );
+}
+
+Duration
+Duration_convert::ticks2_dur( int ticks_i )
+{
+ /* this is cute,
+ but filling an array using Duration_iterator
+ might speed things up, a little
+ */
+ Moment mom( ticks_i, Duration::division_1_i_s );
+ Duration_iterator iter_dur;
+ assert( iter_dur );
+ while ( iter_dur ) {
+ Duration dur = iter_dur++;
+ if ( mom == dur2_mom( dur ) )
+ return dur;
+ }
+ Duration dur( 0 );
+ dur.set_ticks( ticks_i );
+ return dur;
+}
+
+Duration
+Duration_convert::ticks2standardised_dur( int ticks_i )
+{
+ /* this is cute,
+ but filling an array using Duration_iterator
+ might speed things up, a little
+ */
+ Moment mom( ticks_i, Duration::division_1_i_s );
+ Duration_iterator iter_dur;
+ assert( iter_dur );
+ while ( iter_dur ) {
+ Duration lower_dur = iter_dur++;
+// Duration upper_dur( 0 );
+ Duration upper_dur( 1, 1 );
+ if ( iter_dur )
+ upper_dur = iter_dur();
+ Moment lower_mom = dur2_mom( lower_dur );
+ Moment upper_mom = dur2_mom( upper_dur );
+ if ( mom < lower_mom )
+ return lower_dur;
+ if ( mom == lower_mom )
+ return lower_dur;
+ if ( mom == upper_mom ) // don-t miss last (sic)
+ return upper_dur;
+ if ( ( mom >= lower_mom ) && ( mom <= upper_mom ) ) {
+ warning( String( "duration not exact: " ) + String( (Real)mom ) , 0 );
+ if ( abs( mom - lower_mom ) < abs( mom - upper_mom ) )
+ return lower_dur;
+ else
+ return upper_dur;
+ }
+ lower_dur = upper_dur;
+ }
+ return iter_dur();
+}
+
+Duration_iterator::Duration_iterator()
+{
+ cursor_dur_.type_i_ = 128;
+ if ( Duration_convert::no_smaller_than_i_s )
+ cursor_dur_.type_i_ = Duration_convert::no_smaller_than_i_s;
+ cursor_dur_.set_plet( 0,1 ); // ugh?
+}
+
+Duration
+Duration_iterator::operator ++(int)
+{
+ return forward_dur();
+}
+
+Duration
+Duration_iterator::operator ()()
+{
+ return dur();
+}
+
+Duration_iterator::operator bool()
+{
+ return ok();
+}
+
+Duration
+Duration_iterator::dur()
+{
+ return cursor_dur_;
+}
+
+Duration
+Duration_iterator::forward_dur()
+{
+ /* should do smart table? guessing:
+ duration wholes
+ 16 0.0625
+ 32.. 0.0703
+ 8:2/3 0.0833
+ 16. 0.0938
+ 8 0.1250
+ 16.. 0.1406
+ 4:2/3 0.1667
+ 8. 0.1875
+
+ */
+ assert( ok() );
+
+ Duration dur = cursor_dur_;
+
+ if ( !cursor_dur_.dots_i_ && !cursor_dur_.plet_b() ) {
+ cursor_dur_.type_i_ *= 2;
+ cursor_dur_.dots_i_ = 2;
+ }
+ else if ( cursor_dur_.dots_i_ == 2 ) {
+ assert( !cursor_dur_.plet_b() );
+ cursor_dur_.dots_i_ = 0;
+ cursor_dur_.type_i_ /= 4;
+ cursor_dur_.set_plet( 2, 3 );
+ }
+ else if ( cursor_dur_.plet_b()
+ && ( cursor_dur_.plet_.iso_i_ == 2 )
+ && ( cursor_dur_.plet_.type_i_ == 3 ) ) {
+ assert( !cursor_dur_.dots_i_ );
+ cursor_dur_.set_plet( 0,1 );
+ cursor_dur_.type_i_ *= 2;
+ cursor_dur_.dots_i_ = 1;
+ }
+ else if ( cursor_dur_.dots_i_ == 1 ) {
+ assert( !cursor_dur_.plet_b() );
+ cursor_dur_.dots_i_ = 0;
+ cursor_dur_.type_i_ /= 2;
+ }
+
+ if ( Duration_convert::no_triplets_b_s
+ && cursor_dur_.plet_b() && ok() )
+ forward_dur();
+ if ( Duration_convert::no_double_dots_b_s
+ && ( cursor_dur_.dots_i_ == 2 ) && ok() )
+ forward_dur();
+ if ( Duration_convert::no_smaller_than_i_s
+ && ( cursor_dur_.type_i_ > Duration_convert::no_smaller_than_i_s ) && ok() )
+ forward_dur();
+ if ( Duration_convert::no_smaller_than_i_s
+ && cursor_dur_.dots_i_
+ && ( cursor_dur_.type_i_ >= Duration_convert::no_smaller_than_i_s )
+ && ok() )
+ forward_dur();
+ if ( Duration_convert::no_smaller_than_i_s
+ && ( cursor_dur_.dots_i_ == 2 )
+ && ( cursor_dur_.type_i_ >= Duration_convert::no_smaller_than_i_s / 2 )
+ && ok() )
+ forward_dur();
+
+ return dur;
+}
+
+bool
+Duration_iterator::ok()
+{
+ return ( cursor_dur_.type_i_
+ && !( ( cursor_dur_.type_i_ == 1 ) && ( cursor_dur_.dots_i_ > 2 ) ) );
+}
-//
-// duration.cc -- implement Duration, Plet, Duration_convert, Duration_iterator
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
+/*
+ duration.cc -- implement Duration, Plet,
+
+ source file of the LilyPond music typesetter
+
+ copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
// split into 4?
#include "moment.hh"
#include "duration.hh"
#include "debug.hh" //ugh
+#include "duration-convert.hh"
// statics Duration
int Duration::division_1_i_s = 384 * 4;
-Duration::Duration( int type_i, int dots_i = 0, Plet* plet_l )
+Duration::Duration( int type_i, int dots_i = 0)
{
type_i_ = type_i;
dots_i_ = dots_i;
- plet_p_ = 0;
- ticks_i_ = 0;
- set_plet( plet_l );
-}
-
-Duration::Duration( Duration const& dur_c_r )
-{
- type_i_ = 0;
- dots_i_ = 0;
- plet_p_ = 0;
ticks_i_ = 0;
- *this = dur_c_r;
-}
-
-Duration::~Duration()
-{
- delete plet_p_;
}
-
-Duration const&
-Duration::operator =( Duration const& dur_c_r )
+void
+Duration::set_plet(int i, int t)
{
- if ( &dur_c_r == this )
- return *this;
-
- type_i_ = dur_c_r.type_i_;
- dots_i_ = dur_c_r.dots_i_;
- ticks_i_ = dur_c_r.ticks_i_;
- set_plet( dur_c_r.plet_p_ );
-
- return *this;
+ plet_.iso_i_ = i;
+ plet_.type_i_ = t;
}
-void
-Duration::set_plet( Plet* plet_l )
+Moment
+Duration::length() const
{
- delete plet_p_;
- plet_p_ = 0;
- if ( plet_l )
- plet_p_ = new Plet( *plet_l );
+ return Duration_convert::dur2_mom(*this);
}
-
void
Duration::set_ticks( int ticks_i )
{
assert( !type_i_ );
assert( !dots_i_ );
- assert( !plet_p_ );
ticks_i_ = ticks_i;
}
-
+String
+Duration::str()const
+{
+ return Duration_convert::dur2_str(*this);
+}
Plet::Plet( int iso_i, int type_i )
{
iso_i_ = iso_i;
type_i_ = type_i;
}
-
-
-// statics Duration_convert
-bool Duration_convert::be_blonde_b_s = false;
-bool Duration_convert::no_double_dots_b_s = false;
-bool Duration_convert::no_triplets_b_s = false;
-int Duration_convert::no_smaller_than_i_s = 0;
-
-String
-Duration_convert::dur2_str( Duration dur )
-{
- if ( dur.ticks_i_ )
- return String( "[" ) + String( dur.ticks_i_ ) + "]";
-
- String str( dur.type_i_ );
- str += String( '.', dur.dots_i_ );
- if ( dur.plet_p_ )
- str += String( "*" ) + String( dur.plet_p_->iso_i_ )
- + String( "/" ) + String( dur.plet_p_->type_i_ );
- return str;
-}
-
-#if 0
-int
-Duration_convert::dur2_i( Duration dur, int division_1_i )
-{
- return dur2_mom( dur ) * Moment( division_1_i );
-}
-#endif
-
-int
-Duration_convert::dur2ticks_i( Duration dur )
-{
- if ( dur.ticks_i_ )
- return dur.ticks_i_;
- return dur2_mom( dur ) * Moment( Duration::division_1_i_s );
-}
-
-Moment
-Duration_convert::dur2_mom( Duration dur )
-{
- if ( dur.ticks_i_ )
- return Moment( dur.ticks_i_, Duration::division_1_i_s );
-
- // or simply assert?
- if ( !dur.type_i_ )
- return Moment( 0 );
-
- Moment mom = Moment( 1 , dur.type_i_ );
-
- Moment delta = mom;
- while ( dur.dots_i_-- ) {
- delta /= 2.0;
- mom += delta;
- }
-
- return mom * plet_factor_mom( dur );
-}
-
-#if 0
-Moment
-Duration_convert::i2_mom( int time_i, int division_1_i )
-{
- if ( !time_i )
- return Moment( 0 );
-
- if ( division_1_i > 0 )
- return Moment( time_i, division_1_i );
- else
- return Moment( -division_1_i, time_i );
-}
-#endif
-
-#if 0
-Duration
-Duration_convert::mom2_dur( Moment mom )
-{
- /* this is cute,
- but filling an array using Duration_iterator
- might speed things up, a little
- */
- Duration_iterator iter_dur;
- assert( iter_dur );
- while ( iter_dur ) {
- Duration lower_dur = iter_dur++;
- Duration upper_dur( 0 );
- if ( iter_dur )
- upper_dur = iter_dur();
- Moment lower_mom = dur2_mom( lower_dur );
- Moment upper_mom = dur2_mom( upper_dur );
- if ( mom == lower_mom )
- return lower_dur;
- if ( mom == upper_mom ) // don-t miss last (sic)
- return upper_dur;
- if ( ( mom >= lower_mom ) && ( mom <= upper_mom ) ) {
- warning( String( "duration not exact: " ) + String( (Real)mom ) , 0 );
- if ( abs( mom - lower_mom ) < abs( mom - upper_mom ) )
- return lower_dur;
- else
- return upper_dur;
- }
- lower_dur = upper_dur;
- }
- return Duration( 0 );
-}
-#endif
-
Moment
-Duration_convert::plet_factor_mom( Duration dur )
-{
- if ( !dur.plet_p_ )
- return 1;
- return Moment( dur.plet_p_->iso_i_, dur.plet_p_->type_i_ );
-}
-
-Real
-Duration_convert::sync_f( Duration dur, Moment mom )
-{
- return mom / dur2_mom( dur );
-}
-
-Duration
-Duration_convert::ticks2_dur( int ticks_i )
-{
- /* this is cute,
- but filling an array using Duration_iterator
- might speed things up, a little
- */
- Moment mom( ticks_i, Duration::division_1_i_s );
- Duration_iterator iter_dur;
- assert( iter_dur );
- while ( iter_dur ) {
- Duration dur = iter_dur++;
- if ( mom == dur2_mom( dur ) )
- return dur;
- }
- Duration dur( 0 );
- dur.set_ticks( ticks_i );
- return dur;
-}
-
-Duration
-Duration_convert::ticks2standardised_dur( int ticks_i )
+Plet::mom()const
{
- /* this is cute,
- but filling an array using Duration_iterator
- might speed things up, a little
- */
- Moment mom( ticks_i, Duration::division_1_i_s );
- Duration_iterator iter_dur;
- assert( iter_dur );
- while ( iter_dur ) {
- Duration lower_dur = iter_dur++;
-// Duration upper_dur( 0 );
- Duration upper_dur( 1, 1 );
- if ( iter_dur )
- upper_dur = iter_dur();
- Moment lower_mom = dur2_mom( lower_dur );
- Moment upper_mom = dur2_mom( upper_dur );
- if ( mom < lower_mom )
- return lower_dur;
- if ( mom == lower_mom )
- return lower_dur;
- if ( mom == upper_mom ) // don-t miss last (sic)
- return upper_dur;
- if ( ( mom >= lower_mom ) && ( mom <= upper_mom ) ) {
- warning( String( "duration not exact: " ) + String( (Real)mom ) , 0 );
- if ( abs( mom - lower_mom ) < abs( mom - upper_mom ) )
- return lower_dur;
- else
- return upper_dur;
- }
- lower_dur = upper_dur;
- }
- return iter_dur();
+ return Moment( iso_i_, type_i_ );
}
-Duration_iterator::Duration_iterator()
+Plet::Plet()
{
- cursor_dur_.type_i_ = 128;
- if ( Duration_convert::no_smaller_than_i_s )
- cursor_dur_.type_i_ = Duration_convert::no_smaller_than_i_s;
- cursor_dur_.set_plet( 0 );
+ type_i_ = 1;
+ iso_i_ = 1;
}
-
-Duration
-Duration_iterator::operator ++(int)
-{
- return forward_dur();
-}
-
-Duration
-Duration_iterator::operator ()()
-{
- return dur();
-}
-
-Duration_iterator::operator bool()
-{
- return ok();
-}
-
-Duration
-Duration_iterator::dur()
+bool
+Plet::unit_b()const
{
- return cursor_dur_;
+ return type_i_ == 1 && iso_i_ == 1;
}
-
-Duration
-Duration_iterator::forward_dur()
-{
- // should do smart table? guessing:
- // duration wholes
- // 16 0.0625
- // 32.. 0.0703
- // 8:2/3 0.0833
- // 16. 0.0938
- // 8 0.1250
- // 16.. 0.1406
- // 4:2/3 0.1667
- // 8. 0.1875
-
- assert( ok() );
-
- Duration dur = cursor_dur_;
-
- if ( !cursor_dur_.dots_i_ && !cursor_dur_.plet_p_ ) {
- cursor_dur_.type_i_ *= 2;
- cursor_dur_.dots_i_ = 2;
- }
- else if ( cursor_dur_.dots_i_ == 2 ) {
- assert( !cursor_dur_.plet_p_ );
- cursor_dur_.dots_i_ = 0;
- cursor_dur_.type_i_ /= 4;
- cursor_dur_.set_plet( &Plet( 2, 3 ) );
- }
- else if ( cursor_dur_.plet_p_
- && ( cursor_dur_.plet_p_->iso_i_ == 2 )
- && ( cursor_dur_.plet_p_->type_i_ == 3 ) ) {
- assert( !cursor_dur_.dots_i_ );
- cursor_dur_.set_plet( 0 );
- cursor_dur_.type_i_ *= 2;
- cursor_dur_.dots_i_ = 1;
- }
- else if ( cursor_dur_.dots_i_ == 1 ) {
- assert( !cursor_dur_.plet_p_ );
- cursor_dur_.dots_i_ = 0;
- cursor_dur_.type_i_ /= 2;
- }
-
- if ( Duration_convert::no_triplets_b_s && cursor_dur_.plet_p_ && ok() )
- forward_dur();
- if ( Duration_convert::no_double_dots_b_s && ( cursor_dur_.dots_i_ == 2 ) && ok() )
- forward_dur();
- if ( Duration_convert::no_smaller_than_i_s && ( cursor_dur_.type_i_ > Duration_convert::no_smaller_than_i_s ) && ok() )
- forward_dur();
- if ( Duration_convert::no_smaller_than_i_s && cursor_dur_.dots_i_ && ( cursor_dur_.type_i_ >= Duration_convert::no_smaller_than_i_s ) && ok() )
- forward_dur();
- if ( Duration_convert::no_smaller_than_i_s && ( cursor_dur_.dots_i_ == 2 ) && ( cursor_dur_.type_i_ >= Duration_convert::no_smaller_than_i_s / 2 ) && ok() )
- forward_dur();
-
- return dur;
-}
-
bool
-Duration_iterator::ok()
+Duration::plet_b()
{
- return ( cursor_dur_.type_i_
- && !( ( cursor_dur_.type_i_ == 1 ) && ( cursor_dur_.dots_i_ > 2 ) ) );
+ return !plet_.unit_b();
}
--- /dev/null
+/*
+ includable-lexer.cc -- implement Includable_lexer
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+#include "includable-lexer.hh"
+#include "source-file.hh"
+#include "source.hh"
+
+Includable_lexer::Includable_lexer()
+{
+ yy_current_buffer = 0;
+}
+
+/** set the new input to s, remember old file.
+*/
+void
+Includable_lexer::new_input(String s, Sources * global_sources)
+{
+ Source_file * sl = global_sources->get_file_l(s);
+ if (!sl) {
+ LexerError("can't find file");
+ return;
+ }
+ char_count_stack_.push(0);
+ if (yy_current_buffer)
+ state_stack_.push(yy_current_buffer);
+ cout << "[" << s<<flush;
+ include_stack_.push(sl);
+
+ // ugh. We'd want to create a buffer from the bytes directly.
+ yy_switch_to_buffer(yy_create_buffer( sl->istream_l(), sl->length_off() ));
+}
+
+/** pop the inputstack. conceptually this is a destructor, but it
+ does not destruct the Source_file it creates. */
+bool
+Includable_lexer::close_input()
+{
+ include_stack_.pop();
+ char_count_stack_.pop();
+ cout << "]"<<flush;
+ yy_delete_buffer(yy_current_buffer );
+ if (state_stack_.empty()) {
+ yy_current_buffer = 0;
+ return false;
+ }else {
+ yy_switch_to_buffer(state_stack_.pop());
+ return true;
+ }
+}
+
+char const*
+Includable_lexer::here_ch_C()
+{
+ if (include_stack_.empty())
+ return 0;
+ return include_stack_.top()->ch_C() + char_count_stack_.top();
+}
+
+Includable_lexer::~Includable_lexer()
+{
+ while (!include_stack_.empty()) {
+ close_input();
+ };
+}
+/**
+ Since we don't create the buffer state from the bytes directly, we
+ don't know about the location of the lexer. Add this as a
+ YY_USER_ACTION */
+void
+Includable_lexer::add_lexed_char(int count)
+{
+ char_count_stack_.top() += count;
+}
#ifndef BINARY_SOURCE_FILE_HH
#define BINARY_SOURCE_FILE_HH
+#include "source-file.hh"
+
class Binary_source_file : public Source_file {
public:
Binary_source_file( String& filename_str );
--- /dev/null
+
+/*
+ duration-convert.hh -- declare
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef DURATION_CONVERT_HH
+#define DURATION_CONVERT_HH
+#include "duration.hh"
+#include "string.hh"
+
+/**
+ Duration_convert handles all conversions to -n fro Duration (dur).
+ That is including (integer + division) representation for MIDI,
+ and conversion from unexact time representation (best guess :-).
+
+ A Moment (mom) is a Rational that holds the time fraction
+ compared to a whole note (before also called wholes).
+
+ SUGGESTION: currently a moment in time is called moment too;
+ let-s typedef Rational When too, so that we get
+ When Staff_column::when(), Moment Voice_element::mom().
+*/
+struct Duration_convert {
+
+ /* Urgh. statics.
+ */
+ static bool be_blonde_b_s; // cute, but not informative. everythiing is blonde, right? HW
+ static bool no_double_dots_b_s;
+ static bool no_triplets_b_s;
+ static int no_smaller_than_i_s;
+
+// /// Most used division in MIDI, all fine with me.
+// static int const division_1_c_i = 384;
+
+// /// Return (integer, division) representation.
+// static int dur2_i( Duration dur, int division_1_i = division_1_c_i );
+
+ /// Return number of ticks in (ticks, division_1) representation
+ static int dur2ticks_i( Duration dur );
+
+ /// Return Moment representation (fraction of whole note).
+ static Moment dur2_mom( Duration dur );
+
+ /// Return Mudela string representation.
+ static String dur2_str( Duration dur );
+
+// /// Return Moment from (integer, division) representation.
+// static Moment i2_mom( int i, int division_1_i = division_1_c_i );
+
+// /// Return Moment (fraction of whole) representation, best guess.
+// static Duration mom2_dur( Moment mom );
+
+ /// Return plet factor (not a Moment: should use Rational?).
+ static Moment plet_factor_mom( Duration dur );
+
+ /** Return synchronisation factor for mom, so that
+ mom2_dur( mom / sync_f ) will return the duration dur.
+ */
+ static Real sync_f( Duration dur, Moment mom );
+
+ /// Return exact duration, in midi-ticks if not-exact.
+ static Duration ticks2_dur( int ticks_i );
+
+ /// Return standardised duration, best guess if not exact.
+ static Duration ticks2standardised_dur( int ticks_i );
+};
+
+/// (iter_dur)
+struct Duration_iterator {
+ /// start at shortest: 128:2/3
+ Duration_iterator();
+
+ // **** what about these three here ?
+ /// return forward_dur();
+ Duration operator ++(int);
+
+ /// return ok()
+ operator bool();
+
+ /// return dur()
+ Duration operator ()();
+ // ****
+
+ /// return current dur
+ Duration dur();
+
+ /// return dur(), step to next
+ Duration forward_dur();
+
+ /// durations left?
+ bool ok();
+
+private:
+ Duration cursor_dur_;
+};
+
+
+#endif // DURATION_CONVERT_HH
-//
-// duration.hh -- declare Duration, Plet, Duration_convert Duration_iterator
-//
-// copyright 1997 Jan Nieuwenhuizen <jan@digicash.com>
+/*
+ duration.hh -- declare Duration Plet
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
+
+*/
// split into 4?
#ifndef DURATION_HH
#define DURATION_HH
+#include "fproto.hh"
+#include "moment.hh"
+
// ugh, to get me in lily lib
extern bool no_triplets_bo_g;
-/// (dur)
-struct Duration {
- // actually i hate it when other people use default arguments,
- // because it makes you easily loose track of what-s really
- // happening; in the routine-s implementation you-re not aware
- // of this defaultness (who sets this stupid value?).
- Duration( int type_i = 1, int dots_i = 0, Plet* plet_p = 0 );
- Duration( Duration const& dur_c_r );
- ~Duration();
-
- Duration const& operator =( Duration const& dur_c_r );
-
- void set_plet( Plet* plet_l ); // handiger: newt zelf
- void set_ticks( int ticks_i );
-
- static int division_1_i_s;
- int type_i_;
- int dots_i_;
- Plet* plet_p_;
- int ticks_i_;
-};
-
-/// (plet)
+/** (plet)
+ The type and replacement value of a plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3
+ */
struct Plet {
- Plet( int replace_i, int type_i );
-
+ Plet( int replace_i, int type_i );
+ Plet();
+ Moment mom()const;
+ bool unit_b()const;
int iso_i_; // 2/3; 2 is not duration, maar of count!
- int type_i_;
+ int type_i_;
};
/**
- Duration_convert handles all conversions to -n fro Duration (dur).
- That is including (integer + division) representation for MIDI,
- and conversion from unexact time representation (best guess :-).
-
- A Moment (mom) is a Rational that holds the time fraction
- compared to a whole note (before also called wholes).
-
- SUGGESTION: currently a moment in time is called moment too;
- let-s typedef Rational When too, so that we get
- When Staff_column::when(), Moment Voice_element::mom().
-*/
-struct Duration_convert {
- static bool be_blonde_b_s;
- static bool no_double_dots_b_s;
- static bool no_triplets_b_s;
- static int no_smaller_than_i_s;
-
-// /// Most used division in MIDI, all fine with me.
-// static int const division_1_c_i = 384;
-
-// /// Return (integer, division) representation.
-// static int dur2_i( Duration dur, int division_1_i = division_1_c_i );
-
- /// Return number of ticks in (ticks, division_1) representation
- static int dur2ticks_i( Duration dur );
-
- /// Return Moment representation (fraction of whole note).
- static Moment dur2_mom( Duration dur );
-
- /// Return Mudela string representation.
- static String dur2_str( Duration dur );
-
-// /// Return Moment from (integer, division) representation.
-// static Moment i2_mom( int i, int division_1_i = division_1_c_i );
-
-// /// Return Moment (fraction of whole) representation, best guess.
-// static Duration mom2_dur( Moment mom );
-
- /// Return plet factor (not a Moment: should use Rational?).
- static Moment plet_factor_mom( Duration dur );
-
- /** Return synchronisation factor for mom, so that
- mom2_dur( mom / sync_f ) will return the duration dur.
- */
- static Real sync_f( Duration dur, Moment mom );
-
- /// Return exact duration, in midi-ticks if not-exact.
- static Duration ticks2_dur( int ticks_i );
-
- /// Return standardised duration, best guess if not exact.
- static Duration ticks2standardised_dur( int ticks_i );
-};
-
-/// (iter_dur)
-struct Duration_iterator {
- /// start at shortest: 128:2/3
- Duration_iterator();
-
- // **** what about these three here ?
- /// return forward_dur();
- Duration operator ++(int);
-
- /// return ok()
- operator bool();
-
- /// return dur()
- Duration operator ()();
- // ****
-
- /// return current dur
- Duration dur();
-
- /// return dur(), step to next
- Duration forward_dur();
-
- /// durations left?
- bool ok();
-
-private:
- Duration cursor_dur_;
+ Class to handle "musical" durations. This means: balltype 1,2,4,etc. and dots.
+
+ (dur)
+ */
+struct Duration {
+ /* actually i hate it when other people use default arguments,
+ because it makes you easily loose track of what-s really
+ happening; in the routine-s implementation you-re not aware
+ of this defaultness (who sets this stupid value?).*/
+ Duration( int type_i = 1, int dots_i = 0);
+ /// is the "plet factor" of this note != 1 ?
+ bool plet_b();
+ String str()const;
+ void set_plet(int,int );
+ void set_ticks( int ticks_i );
+ Moment length() const ; // zo naai mij
+ static int division_1_i_s;
+ int type_i_;
+ int dots_i_;
+ Plet plet_;
+ int ticks_i_;
};
-
#endif // DURATION_HH
--- /dev/null
+/*
+ includable-lexer.hh -- declare
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef INCLUDABLE_LEXER_HH
+#define INCLUDABLE_LEXER_HH
+#include "string.hh"
+#include <FlexLexer.h>
+#include "varray.hh"
+#include "fproto.hh"
+#include "proto.hh"
+
+// GIGA urg!
+typedef struct yy_buffer_state *YY_BUFFER_STATE;
+
+/**
+ an yyFlexLexer child with provisions for inclusion.
+ */
+class Includable_lexer : public yyFlexLexer {
+ Array<YY_BUFFER_STATE> state_stack_;
+protected:
+ bool close_input();
+ Array<Source_file*> include_stack_;
+ Array<int> char_count_stack_;
+public:
+ void new_input(String s,Sources*);
+ Includable_lexer();
+ ~Includable_lexer();
+ void add_lexed_char(int);
+ char const * here_ch_C();
+};
+
+
+#endif // INCLUDABLE_LEXER_HH
+++ /dev/null
-/*
- input-file.hh -- declare Input_file
-
- source file of the LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
-*/
-
-#ifndef INPUT_FILE_HH
-#define INPUT_FILE_HH
-#include <FlexLexer.h>
-#include "proto.hh"
-#include "fproto.hh"
-#include "varray.hh"
-#include "string.hh"
-
-struct Input_file {
- istream* is;
- char const* defined_ch_c_l_;
- Source_file* sourcefile_l_;
- int line;
- String name;
-
- Input_file(String);
- ~Input_file();
-};
-
-#endif // INPUT_FILE_HH
struct Slur;
struct Slur_register;
struct Slur_req;
-struct Source;
+struct Sources;
struct Source_file;
struct Spacing_req ;
struct Span_req;
#ifndef SOURCE_FILE_HH
#define SOURCE_FILE_HH
-
+#include "fproto.hh"
+#include "string.hh"
+class istream;
/// class for reading and mapping a file.
class Source_file
{
public:
/** Ugh! filename gets changed! The path to the opened file may
change, since it might be searched in multiple directories. */
- Source_file( String& filename_str_r );
+ Source_file( String filename_str_r );
virtual ~Source_file();
- char const* ch_c_l();
+ char const* ch_C();
virtual String error_str( char const* pos_ch_c_l );
- istream* istream_l();
+ istream * istream_l();
bool in_b( char const* pos_ch_c_l );
off_t length_off();
virtual int line_i( char const* pos_ch_c_l );
#ifndef SOURCE_HH
#define SOURCE_HH
-
-class Source
+#include "source-file.hh"
+#include "plist.hh"
+#include "path.hh"
+class Sources
{
public:
- Source();
- ~Source();
-
- void add( Source_file* sourcefile_p );
+ Source_file * get_file_l( String &filename );
Source_file* sourcefile_l( char const* ch_c_l );
-
+ void set_path(File_path*p_C);
+ Sources();
+ void set_binary(bool);
private:
+ const File_path * path_C_;
+ void add( Source_file* sourcefile_p );
IPointerList<Source_file*> sourcefile_p_iplist_;
+ bool binary_b_ ;
};
-// ugh
-extern Source* source_l_g;
#endif // SOURCE_HH //
+++ /dev/null
-/*
- input-file.cc -- implement Input_file
-
- source file of the LilyPond music typesetter
-
- (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl> Jan Nieuwenhuizen <jan@digicash.com>
-*/
-
-#include <iostream.h>
-#include <strstream.h>
-#include "proto.hh"
-#include "plist.hh"
-#include "input-file.hh"
-#include "debug.hh"
-#include "source-file.hh"
-#include "binary-source-file.hh"
-#include "source.hh"
-
-Input_file::Input_file(String s)
-{
- name = s;
- line = 1;
- String pf(s);
- if ( pf == "" ) {
- is = &cin;
- defined_ch_c_l_ = 0;
- sourcefile_l_ = 0;
- }
- else {
- Source_file* sourcefile_p = 0;
- // ugh, very dirty, need to go away
- if ( ( pf.right_str( 3 ).lower_str() == "mid" ) || ( pf.right_str( 4 ).lower_str() == "midi" ) )
- sourcefile_p = new Binary_source_file( pf );
- else
- sourcefile_p = new Source_file( pf );
- source_l_g->add( sourcefile_p );
- sourcefile_l_ = sourcefile_p;
- is = sourcefile_l_->istream_l();
- defined_ch_c_l_ = sourcefile_l_->ch_c_l();
- }
- cout << "[" << pf << flush;
-}
-
-Input_file::~Input_file()
-{
- cout << "]" << flush;
-}
#include "proto.hh"
#include "plist.hh"
-//#include "lexer.hh"
#include "debug.hh"
#include "windhoos-suck-suck-suck-thank-you-cygnus.hh"
-// #include "parseconstruct.hh" // defined_ch_c_l
-extern char const* defined_ch_c_l;
-
-// ugh
-// #include "main.hh" // find_file
-String find_file(String);
#include "source-file.hh"
-Source_file::Source_file( String &filename_str )
+Source_file::Source_file( String filename_str )
{
data_caddr_ = 0;
fildes_i_ = 0;
open();
map();
- // ugh!?, should call name_str() !
- filename_str = name_str_;
+}
+
+istream*
+Source_file::istream_l()
+{
+ assert( fildes_i_ );
+ if ( !istream_p_ ) {
+ if ( size_off_ ) // can-t this be done without such a hack?
+ istream_p_ = new istrstream( ch_C(), size_off_ );
+ else {
+ istream_p_ = new istrstream( "", 0 );
+ istream_p_->set(ios::eofbit);
+ }
+ }
+ return istream_p_;
}
Source_file::~Source_file()
}
char const*
-Source_file::ch_c_l()
+Source_file::ch_C()
{
assert( this );
return (char const*)data_caddr_;
}
String
-Source_file::error_str( char const* pos_ch_c_l )
+Source_file::error_str( char const* pos_ch_C )
{
- assert( this );
- if ( !in_b( pos_ch_c_l ) )
- return "";
-
- char const* begin_ch_c_l = pos_ch_c_l;
- char const* data_ch_c_l = ch_c_l();
- while ( begin_ch_c_l > data_ch_c_l )
- if ( *--begin_ch_c_l == '\n' ) {
- begin_ch_c_l++;
+ char const* data_ch_C = ch_C();
+ char const * eof_C_ = data_ch_C + size_off_;
+ if ( !in_b( pos_ch_C ) )
+ return "(position unknown)";
+
+
+ if ( pos_ch_C == eof_C_)
+ pos_ch_C --;
+ char const* begin_ch_C = pos_ch_C;
+ while ( begin_ch_C > data_ch_C )
+ if ( *--begin_ch_C == '\n' ) {
+ begin_ch_C++;
break;
}
- char const* end_ch_c_l = pos_ch_c_l;
- while ( end_ch_c_l < data_ch_c_l + size_off_ )
- if ( *end_ch_c_l++ == '\n' ) {
- break;
+ char const* end_ch_C = pos_ch_C;
+ while ( end_ch_C < eof_C_ )
+ if ( *end_ch_C++ == '\n' ) {
+ end_ch_C--;
+ break;
}
- end_ch_c_l--;
-
-#if 1
-// String( char const* p, int length ) is missing!?
- String line_str( (Byte const*)begin_ch_c_l, end_ch_c_l - begin_ch_c_l );
-#else
- int length_i = end_ch_c_l - begin_ch_c_l;
- char* ch_p = new char[ length_i + 1 ];
- strncpy( ch_p, begin_ch_c_l, length_i );
- ch_p[ length_i ] = 0;
- String line_str( ch_p );
- delete ch_p;
-#endif
+
+ // String( char const* p, int length ) is missing!?
+ String line_str( (Byte const*)begin_ch_C, end_ch_C - begin_ch_C );
int error_col_i = 0;
- char const* scan_ch_c_l = begin_ch_c_l;
- while ( scan_ch_c_l < pos_ch_c_l )
- if ( *scan_ch_c_l++ == '\t' )
+ char const* scan_ch_C = begin_ch_C;
+ while ( scan_ch_C < pos_ch_C )
+ if ( *scan_ch_C++ == '\t' )
error_col_i = ( error_col_i / 8 + 1 ) * 8;
else
error_col_i++;
- String str = line_str.left_str( pos_ch_c_l - begin_ch_c_l )
+ String str = line_str.left_str( pos_ch_C - begin_ch_C )
+ String( '\n' )
+ String( ' ', error_col_i )
- + line_str.mid_str( pos_ch_c_l - begin_ch_c_l, INT_MAX ); // String::mid should take 0 arg..
+ + line_str.mid_str( pos_ch_C - begin_ch_C, INT_MAX ); // String::mid should take 0 arg..
return str;
}
bool
-Source_file::in_b( char const* pos_ch_c_l )
-{
- return ( pos_ch_c_l && ( pos_ch_c_l >= ch_c_l() ) && ( pos_ch_c_l < ch_c_l() + size_off_ ) );
-}
-
-istream*
-Source_file::istream_l()
+Source_file::in_b( char const* pos_ch_C )
{
- assert( fildes_i_ );
- if ( !istream_p_ ) {
- if ( size_off_ ) // can-t this be done without such a hack?
- istream_p_ = new istrstream( ch_c_l(), size_off_ );
- else {
- istream_p_ = new istrstream( "", 0 );
- istream_p_->set(ios::eofbit);
- }
- }
- return istream_p_;
+ return ( pos_ch_C && ( pos_ch_C >= ch_C() ) && ( pos_ch_C <= ch_C() + size_off_ ) );
}
off_t
}
int
-Source_file::line_i( char const* pos_ch_c_l )
+Source_file::line_i( char const* pos_ch_C )
{
- if ( !in_b( pos_ch_c_l ) )
+ if ( !in_b( pos_ch_C ) )
return 0;
int i = 1;
- char const* scan_ch_c_l = ch_c_l();
- while ( scan_ch_c_l < pos_ch_c_l )
- if ( *scan_ch_c_l++ == '\n' )
+ char const* scan_ch_C = ch_C();
+ while ( scan_ch_C < pos_ch_C )
+ if ( *scan_ch_C++ == '\n' )
i++;
return i;
}
data_caddr_ = (caddr_t)mmap( (void*)0, size_off_, PROT_READ, MAP_SHARED, fildes_i_, 0 );
if ( (int)data_caddr_ == -1 )
- // ugh: defined_ch_c_l...
- warning( String( "can't map: " ) + name_str_ + String( ": " ) + strerror( errno ), defined_ch_c_l ); //lexer->here_ch_c_l() );
+ warning( String( "can't map: " ) + name_str_ + String( ": " ) + strerror( errno ), 0);
}
String
void
Source_file::open()
{
- String name_str = find_file( name_str_ );
- if ( name_str != "" )
- name_str_ = name_str;
-
fildes_i_ = ::open( name_str_, O_RDONLY );
if ( fildes_i_ == -1 ) {
- warning( String( "can't open: " ) + name_str_ + String( ": " ) + strerror( errno ), defined_ch_c_l ); // lexer->here_ch_c_l() );
+ warning( String( "can't open: " ) + name_str_ + String( ": " ) + strerror( errno ), 0 );
return;
}
}
}
String
-Source_file::file_line_no_str(char const *ch_c_l )
+Source_file::file_line_no_str(char const *ch_C )
{
return name_str() + ": "
- + String( line_i( ch_c_l ) );
+ + String( line_i( ch_C ) );
}
-//
-// source.cc
-//
+/*
+ source.cc -- implement Source
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
#include <assert.h>
+#include "binary-source-file.hh"
#include "string.hh"
#include "proto.hh"
#include "plist.hh"
-
#include "source-file.hh"
#include "source.hh"
-Source::Source()
+void
+Sources::set_path(File_path *f_C)
+{
+ path_C_ = f_C;
+}
+
+/**
+ open a file
+
+ @param file_str the file to be opened, name might be changed if it
+ is found in a search path.
+
+ @return 0 if no file found
+ */
+Source_file*
+Sources::get_file_l(String &file_str )
{
+ if (path_C_){
+ file_str = path_C_->find(file_str);
+ if (file_str== "")
+ return 0;
+ }
+ Source_file * f_p= (!binary_b_) ?
+ new Source_file(file_str) : new Binary_source_file(file_str);
+ add(f_p);
+ return f_p;
}
-Source::~Source()
+Sources::Sources()
{
+ path_C_= 0;
+ binary_b_ = false;
}
void
-Source::add( Source_file* sourcefile_p )
+Sources::add( Source_file* sourcefile_p )
{
sourcefile_p_iplist_.bottom().add( sourcefile_p );
}
+/**
+ search the list for file whose map contains pointer #ch_C#
+
+ @return 0 if not found.
+ */
Source_file*
-Source::sourcefile_l( char const* ch_c_l )
+Sources::sourcefile_l( char const* ch_C )
{
PCursor<Source_file*> sourcefile_l_pcur( sourcefile_p_iplist_.top() );
for ( ; sourcefile_l_pcur.ok(); sourcefile_l_pcur++ )
- if ( sourcefile_l_pcur->in_b( ch_c_l ) )
+ if ( sourcefile_l_pcur->in_b( ch_C ) )
return *sourcefile_l_pcur;
return 0;
}
--- /dev/null
+#include "source-file.hh"
+#include "plist.tcc"
+#include "pcursor.tcc"
+
+
+IPL_instantiate(Source_file);
MAJOR_VERSION = 0
MINOR_VERSION = 0
-PATCH_LEVEL = 43
+PATCH_LEVEL = 44
# use to send patches, always empty for released version:
# include separator: ".postfix", "-pl" makes rpm barf
# force these: Make can't know these have to be generated in advance
my-lily-lexer.cc: $(outdir)/parser.hh
-lexer.l: $(outdir)/parser.hh
+$(outdir)/lexer.cc: $(outdir)/parser.hh
#
{
if (bar_req_l_ ) {
bar_p_ = new Bar(bar_req_l_->type_str_);
- } else if (!get_staff_info().time_c_l_->whole_in_measure_) {
+ } else if (!get_staff_info().time_C_->whole_in_measure_) {
bar_p_ = new Bar("|");
}
Clef_register::read_req(Clef_change_req*c_l)
{
if (!set_type(c_l->clef_str_))
- error("unknown clef type ", c_l->defined_ch_c_l_);
+ error("unknown clef type ", c_l->defined_ch_C_);
}
bool
void
Clef_register::process_requests()
{
- Time_description const *time_l = get_staff_info().time_c_l_;
+ Time_description const *time_l = get_staff_info().time_C_;
if (!clef_req_l_ && (!time_l->whole_in_measure_|| !time_l->when_)) {
clef_p_ = new Clef_item;
clef_p_->change = false;
#include <stdlib.h>
#include "debug.hh"
#include "dstream.hh"
-#include "vector.hh"
+#include "flower-debug.hh"
Dstream *monitor=0;
ostream * nulldev =0;
-
+// ugh
struct _Dinit {
_Dinit() {
nulldev = new ofstream("/dev/null");
#ifndef NDEBUG
set_new_handler(&mynewhandler);
#endif
- set_matrix_debug(*monitor);
+ set_flower_debug(*monitor, check_debug);
+
signal(SIGFPE, float_handler);
}
n_p->position = note_req_l_->note()->height() +
*get_staff_info().c0_position_i_;
} else {
- note_p_ = new Rest ( note_req_l_->rhythmic()->balltype,
- note_req_l_->rhythmic()->dots);
- if (note_req_l_->rhythmic()->balltype <= 2)
+ note_p_ = new Rest ( note_req_l_->rhythmic()->duration_);
+ if (note_req_l_->rhythmic()->duration_.type_i_ <= 2)
note_p_->translate(
Offset(0,
6 * paper()->internote()));
/// the total music def of one movement
struct Input_score {
/// defined where?
- char const * defined_ch_c_l_;
+ char const * defined_ch_C_;
int errorlevel_i_;
/// paper_, staffs_ and commands_ form the problem definition.
struct Input_staff {
- char const * defined_ch_c_l_;
+ char const * defined_ch_C_;
String type;
IPointerList<Input_music*> music_;
--- /dev/null
+struct My_lily_lexer;
+struct My_lily_parser;
struct Local_key_register : Request_register {
Local_key local_key_;
Local_key_item* key_item_p_;
- Key const *key_c_l_;
+ Key const *key_C_;
/* *************** */
virtual void process_requests();
virtual void acknowledge_element(Staff_elem_info);
Input_score* current_iscore_l();
String find_file(String);
String get_version_str();
-extern String infile_str_g;
-extern Source* source_l_g;
+extern Sources* source_l_g;
extern bool only_midi;
extern String default_out_fn;
#define MUSICALREQUESTS_HH
#include "request.hh"
+#include "duration.hh"
/**
This request is used only a base class.
*/
struct Rhythmic_req : virtual Musical_req {
- int balltype;
- int dots;
- Moment plet_factor;
+ Duration duration_;
+
/* *************** */
+ void set_duration(Duration);
static int compare(const Rhythmic_req &, const Rhythmic_req &);
virtual Moment duration() const;
Rhythmic_req();
- Rhythmic_req(int,int);
REQUESTMETHODS(Rhythmic_req, rhythmic);
};
struct Stem_req : Rhythmic_req {
/// preferred direction for the stem
int dir_i_;
- Stem_req(int s, int dots);
+ Stem_req();
REQUESTMETHODS(Stem_req,stem);
};
#ifndef LEXER_HH
#define LEXER_HH
+
#include <FlexLexer.h>
+
#include "proto.hh"
#include "fproto.hh"
#include "varray.hh"
#include "string.hh"
+#include "includable-lexer.hh"
+#include "duration.hh"
-int yylex();
-void yyerror(char const *s);
bool busy_parsing();
void kill_lexer();
void set_lexer();
-struct Lexer_prefs {
- int default_duration, default_dots, default_octave_i_;
- int default_plet_type, default_plet_dur;
- String textstyle_str_;
-
- bool last_duration_mode ;
-
- Lexer_prefs();
- Moment plet_mom();
- void set_default_duration(int *);
- void set_last_duration(int n);
- void set_duration_mode(String s);
- void get_default_duration(int *);
- void set_plet(int,int);
-};
-
-/// lexer with provisions for include files.
-class My_lily_lexer : public yyFlexLexer {
+/// lexer for Mudela
+class My_lily_lexer : public Includable_lexer {
int lookup_keyword(String);
void lookup_notename(int &large, int &small, String s);
int scan_bare_word(String);
int scan_escaped_word(String);
+ bool post_quotes_b_;
public:
- Lexer_prefs prefs;
+ void * lexval_l;
+
- Array<Input_file*> include_stack_;
Assoc<String, Identifier*> *identifier_assoc_p_;
Keyword_table * keytable_p_;
int errorlevel_i_;
/* *************** */
Identifier*lookup_identifier(String s);
- char const* here_ch_c_l();
void push_note_state();
void push_lyric_state();
void pop_state();
void LexerError(char const *);
- String spot() const;
My_lily_lexer();
void add_identifier(Identifier*i);
~My_lily_lexer();
- void new_input(String s);
- bool close_input();
int yylex();
- void print_init_declarations() const;
- void print_user_declarations() const;
+ void print_declarations(bool init_b) const;
+
bool note_state_b() const;
bool lyric_state_b() const;
};
-extern My_lily_lexer *lexer;
-
#endif
--- /dev/null
+/*
+ my-lily-parser.hh -- declare
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef MY_LILY_PARSER_HH
+#define MY_LILY_PARSER_HH
+#include "proto.hh"
+#include "duration.hh"
+#include "string.hh"
+#include "varray.hh"
+#include "lily-proto.hh"
+#include "proto.hh"
+#include "duration.hh"
+#include "string.hh"
+#include "varray.hh"
+
+class My_lily_parser {
+public:
+ friend int yyparse( void*);
+
+ int default_octave_i_;
+ Duration default_duration_;
+ String textstyle_str_;
+
+ bool last_duration_mode ;
+
+ Array<Request*> pre_reqs, post_reqs;
+ Array<const char *> define_spot_array_;
+ char const* defined_ch_C_;
+ int fatal_error_i_;
+ Sources * source_l_;
+ int error_level_i_;
+ bool init_parse_b_;
+ My_lily_lexer * lexer_p_;
+
+ Moment plet_mom();
+ void add_requests( Voice_element*v);
+
+ Voice_element * get_note_element(Note_req * ,Duration *);
+ Voice_element* get_rest_element(String,Duration *);
+ Voice_element* get_word_element(Text_def*, Duration*);
+ void set_last_duration(Duration const *);
+ void set_duration_mode(String s);
+ char const* here_ch_C()const;
+ void remember_spot();
+ Paper_def*default_paper();
+ void do_yyparse();
+ void parser_error(String);
+
+ Request* get_parens_request(char c);
+
+ void set_debug();
+ void set_yydebug(bool);
+ void print_declarations();
+public:
+ void parse_file ( String init_str, String file_str);
+ My_lily_parser(Sources * sources_l);
+};
+
+#endif // MY_LILY_PARSER_HH
#include "proto.hh"
-extern char const* defined_ch_c_l;
-extern char const* req_defined_ch_c_l;
-
-
-
-
-Voice_element * get_note_element(Note_req * ,int *);
-Voice_element* get_rest_element(String,int *);
-Voice_element* get_word_element(Text_def*, int*);
-void add_requests( Voice_element*v, Array<Request*>&req);
-Request* get_request(char);
-Script_def* get_scriptdef(char);
-Text_def*get_text(String s);
+String * get_scriptdef(char c);
+Request* get_script_req(char);
Request* get_plet_request( char c, int dur_i, int type_i );
Request*get_script_req(int d , Script_def*def);
Request*get_text_req(int d , Text_def*def);
Request* get_stemdir_req(int);
-
-
-
-
Request*get_grouping_req(Array<int> i_arr);
#endif // PARSECONSTRUCT_HH
class Request {
public:
Voice_element*elt_l_;
- char const* defined_ch_c_l_;
+ char const* defined_ch_C_;
/* *************** */
Voice * voice_l();
int dots;
int balltype;
-
+
+ /// rests can be translated up and down.
+ int pos_i_;
/* *************** */
- Rest(int dur,int dots);
+ Rest(Duration);
void do_print()const;
NAME_MEMBERS(Rest);
Molecule* brew_molecule_p()const;
IPointerList<Score_column*> cols_;
PScore *pscore_p_;
- char const *defined_ch_c_l_;
+ char const *defined_ch_C_;
int errorlevel_i_;
/* *************************************************************** */
struct Staff_info {
int *c0_position_i_;
Staff_walker *walk_l_;
- Time_description const *time_c_l_;
- Rhythmic_grouping const *rhythmic_c_l_;
+ Time_description const *time_C_;
+ Rhythmic_grouping const *rhythmic_C_;
bool break_allowed_b_;
};
int align_i_;
String text_str_;
String style_str_;
- char const* defined_ch_c_l_;
+ char const* defined_ch_C_;
/* *************** */
*the requests, */
struct Voice_element {
Moment duration;
- char const* defined_ch_c_l_;
+ char const* defined_ch_C_;
Voice const *voice_l_;
IPointerList<Request*> reqs;
if ( i->plet() ) {
Moment start_moment = 0;
if ( !find_plet_start_bo( i->plet()->type_c_, start_moment ) ) {
- error( "begin of plet not found", i->defined_ch_c_l_ );
+ error( "begin of plet not found", i->defined_ch_C_ );
break;
}
Moment moment = 0;
{
paper_p_ = (s.paper_p_)? new Paper_def(*s.paper_p_) :0;
midi_p_ = (s.midi_p_)? new Midi_def(*s.midi_p_) : 0;
- defined_ch_c_l_ = s.defined_ch_c_l_;
+ defined_ch_C_ = s.defined_ch_C_;
errorlevel_i_ = s.errorlevel_i_;
}
Input_score::parse()
{
Score *s_p = new Score;
- s_p->defined_ch_c_l_= defined_ch_c_l_;
+ s_p->defined_ch_C_= defined_ch_C_;
s_p->errorlevel_i_ = errorlevel_i_;
if (midi_p_)
s_p->set(new Midi_def(*midi_p_));
Input_score::Input_score()
{
- defined_ch_c_l_=0;
+ defined_ch_C_=0;
paper_p_= 0;
midi_p_ = 0;
errorlevel_i_ = 0;
Input_staff::Input_staff(String s)
{
type= s;
- defined_ch_c_l_ = 0;
+ defined_ch_C_ = 0;
}
void
else if (type == "lyric")
p = new Lyric_staff;
else {
- error( "Unknown staff-type `" + type +"\'", defined_ch_c_l_ );
+ error( "Unknown staff-type `" + type +"\'", defined_ch_C_ );
exit( 1 );
}
{
for (iter_top(s.music_,i); i.ok(); i++)
add(i->clone());
- defined_ch_c_l_ = s.defined_ch_c_l_;
+ defined_ch_C_ = s.defined_ch_C_;
type = s.type;
}
void
Key_register::process_requests()
{
- Time_description const *time_l = get_staff_info().time_c_l_;
+ Time_description const *time_l = get_staff_info().time_C_;
if (!keyreq_l_ &&
(!time_l->whole_in_measure_|| !time_l->when_)) {
yy_push_state(quote);\
yylval.string = new String
+#define yylval (*(YYSTYPE*)lexval_l)
+#define YY_USER_ACTION add_lexed_char(YYLeng());
%}
%option c++
%option noyywrap
%option nodefault
-%option yylineno
%option debug
%option yyclass="My_lily_lexer"
%option stack
+%option never-interactive
+%option warn
%x incl
%x lyrics
-^include {
+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);
- defined_ch_c_l = here_ch_c_l() - String( YYText() ).length_i() - 1;
- new_input(s);
- yy_pop_state();
+ String s (YYText()+1);
+ s = s.left_str(s.length_i()-1);
+ mtor << "#include `" << s << "\'\n";
+// defined_ch_C = here_ch_C() - String( YYText() ).length_i() - 1;
+ new_input(s,source_l_g);
+ yy_pop_state();
}
<notes>{RESTNAME} {
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());
yylval.i = String_convert::dec2_i( String( YYText() ) );
return INT;
}
-<notes>[ \t\n]+ {
-}
<notes>\+\+ {
return CONCAT;
}
<notes>\" {
start_quote();
}
-<notes>. {
- return yylval.c = YYText()[0];
-}
\" {
start_quote();
}
+<quote>\\\\ {
+ *yylval.string += '\\';
+}
<quote>\\\" {
*yylval.string +='\"';
}
<lyrics>[()\[\]|/.^>_-] {
return yylval.c = YYText()[0];
}
-<lyrics>[ \t\n]+ {
-}
<<EOF>> {
- mtor << "<<EOF>>";
+ mtor << "<<eof>>";
- if (! close_input())
+ if (! close_input()) {
yyterminate(); // can't move this, since it actually rets a YY_NULL
+ }
}
{WORD} {
return scan_bare_word(YYText());
mtor << "misc char" <<c<<"\n";
return c;
}
-[ \t\n]+ {
+<*>{WHITE}+ {
}
-
-{COMMENT} {
- //ignore
+<notes>. {
+ return yylval.c = YYText()[0];
}
-. {
- error( String( "illegal character: " ) + String( YYText()[0] ), here_ch_c_l() );
+
+<*>. {
+ error( String( "illegal character: " ) + String( YYText()[0] ), here_ch_C() );
return YYText()[0];
}
Local_key_register::Local_key_register()
{
key_item_p_ = 0;
- key_c_l_ = 0;
+ key_C_ = 0;
}
void
} else if (info.elem_p_->name()==Key_item::static_name()) {
Key_register * key_reg_l =
(Key_register*)info.origin_reg_l_arr_[0];
- key_c_l_ = &key_reg_l->key_;
- local_key_.reset(*key_c_l_);
+ key_C_ = &key_reg_l->key_;
+ local_key_.reset(*key_C_);
}
}
void
Local_key_register::process_requests()
{
- Time_description const * time_c_l_ = get_staff_info().time_c_l_;
- if (! time_c_l_->whole_in_measure_){
- if (key_c_l_)
- local_key_.reset(*key_c_l_);
- else if( time_c_l_->when_ >Moment(0))
+ Time_description const * time_C_ = get_staff_info().time_C_;
+ if (! time_C_->whole_in_measure_){
+ if (key_C_)
+ local_key_.reset(*key_C_);
+ else if( time_C_->when_ >Moment(0))
warning ("Help me! can't figure current key", 0);
}
}
#include "source-file.hh"
#include "source.hh"
#include "debug.hh"
-#include "main.hh"
Lyric_item::Lyric_item(Lyric_req* lreq_l, int voice_count_i)
: Text_item(lreq_l,0)
// test context-error
if ( tdef_l()->text_str_.index_i( "Gates" ) >=0)// :-)
- warning( "foul word", tdef_l()->defined_ch_c_l_ );
+ warning( "foul word", tdef_l()->defined_ch_C_ );
}
+/*
+ main.cc -- implement main: entrypoints
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
#include <iostream.h>
#include <assert.h>
#include "proto.hh"
#include "main.hh"
#include "path.hh"
#include "config.hh"
-#include "source-file.hh"
#include "source.hh"
+#include "my-lily-parser.hh"
-Source source;
-Source* source_l_g = &source;
-String infile_str_g;
+Sources* source_l_g = 0;
bool only_midi = false;
extern void parse_file(String,String);
}
} main_init;
+void
+do_one_file(String init_str, String file_str)
+{
+ source_l_g = new Sources;
+ source_l_g->set_path(path);
+ My_lily_parser parser(source_l_g);
+ parser.parse_file(init_str, file_str);
+ do_scores();
+ delete source_l_g;
+ source_l_g = 0;
+}
+
int
main (int argc, char **argv)
{
while ( (arg= oparser.get_next_arg()) ) {
String f(arg);
destill_inname(f);
- infile_str_g = f;
- parse_file(init_str,f);
- do_scores();
+ do_one_file(init_str,f);
p++;
}
if (!p) {
- parse_file(init_str, "");
- do_scores();
+ do_one_file(init_str, "");
}
return 0;
}
-
String
find_file(String f)
{
number_i_ = number_i;
- char const* data_ch_c_l = ""
+ char const* data_ch_C = ""
// "00" "ff58" "0404" "0218" "08"
// "00" "ff51" "0307" "a120"
// why a key at all, in midi?
String data_str;
// only for format 0 (currently using format 1)?
- data_str += String_convert::hex2bin_str( data_ch_c_l );
+ data_str += String_convert::hex2bin_str( data_ch_C );
- char const* footer_ch_c_l = "00" "ff2f" "00";
- String footer_str = String_convert::hex2bin_str( footer_ch_c_l );
+ char const* footer_ch_C = "00" "ff2f" "00";
+ String footer_str = String_convert::hex2bin_str( footer_ch_C );
set( "MTrk", data_str, footer_str );
}
// "" huh?
#include "time.h"
-
+#include "main.hh"
+#include "source.hh"
#include "proto.hh"
#include "plist.hh"
#include "string.hh"
// set track name
Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( track_i, 0, '0' ) );
- midi_track.add( Moment( 0.0 ), &track_name );
+ midi_track.add( Moment( 0 ), &track_name );
// set instrument :-)
Midi_text instrument_name( Midi_text::INSTRUMENT_NAME, "piano" );
- midi_track.add( Moment( 0.0 ), &instrument_name );
+ midi_track.add( Moment( 0 ), &instrument_name );
// set key, help, where to get key, where to get major/minor?
int accidentals_i = 0;
int minor_i = 0;
-#ifdef UGR
- // uph, sorry, wanna test this...
- // menuetto in F
- if ( ( infile_str_g.index_i( "scsii-menuetto" ) >= 0 )
- || ( infile_str_g.index_i( "standchen" ) >= 0 )
- || ( infile_str_g.left_str( 1 ) == String( "s" ) ) )
- accidentals_i = -1;
- // standchen in d
- if ( ( infile_str_g.index_i( "standchen" ) >= 0 ) )
- minor_i = 1;
-#endif
Midi_key midi_key( accidentals_i, minor_i );
- midi_track.add( Moment( 0.0 ), &midi_key );
+ midi_track.add( Moment( 0 ), &midi_key );
Midi_tempo midi_tempo( midi_l_->get_tempo_i( Moment( 1, 4 ) ) );
- midi_track.add( Moment( 0.0 ), &midi_tempo );
+ midi_track.add( Moment( 0 ), &midi_tempo );
Midi_time midi_time( Midi_def::num_i_s, Midi_def::den_i_s, 18 );
- midi_track.add( Moment( 0.0 ), &midi_time );
+ midi_track.add( Moment( 0 ), &midi_time );
for (Midi_walker w (st_l, &midi_track); w.ok(); w++)
w.process_requests();
String str = String( "Creator: " ) + get_version_str() + "\n";
Midi_text creator( Midi_text::TEXT, str );
- midi_track.add( Moment( 0.0 ), &creator );
+ midi_track.add( Moment( 0 ), &creator );
str = "Generated, at ";
str += ctime( &t );
str = str.left_str( str.length_i() - 1 );
str += ",\n";
Midi_text generate( Midi_text::TEXT, str );
- midi_track.add( Moment( 0.0 ), &generate );
+ midi_track.add( Moment( 0 ), &generate );
+ Source_file* sourcefile_l = source_l_g->sourcefile_l( score_l_->defined_ch_C_ );
+ if ( sourcefile_l ) {
+ str = "from musical definition: "
+ + sourcefile_l->file_line_no_str(score_l_->defined_ch_C_);
- str = "from musical definition: " + infile_str_g + "\n";
+ }
Midi_text from( Midi_text::TEXT, str );
- midi_track.add( Moment( 0.0 ), &from );
+ midi_track.add( Moment( 0 ), &from );
// set track name
Midi_text track_name( Midi_text::TRACK_NAME, "Track " + String_convert::i2dec_str( 0, 0, '0' ) );
- midi_track.add( Moment( 0.0 ), &track_name );
-
-#if 0
- /*
- shouldn't impose copyright on output.
- */
- struct tm* tm_l = gmtime( &t );
- String year_str = String_convert::i2dec_str( 1900 + tm_l->tm_year, 4, '0' );
-
- // your copyleft here
- str = " Copyleft (o) " + year_str + "by\n";
- Midi_text copyleft( Midi_text::COPYRIGHT, str );
- midi_track.add( Moment( 0.0 ), ©left );
-
- str = " Han-Wen Nienhuys <hanwen@stack.nl>,"
- " Jan Nieuwenhuizen <jan@digicash.com>\n";
-
- Midi_text authors( Midi_text::COPYRIGHT, str );
- midi_track.add( Moment( 0.0 ), &authors );
-#endif
+ midi_track.add( Moment( 0 ), &track_name );
*midi_stream_l_ << midi_track;
}
// 00 01 one track
// 00 60 96 per quarter-note
-// char const ch_c_l = "0000" "0006" "0001" "0001" "0060";
-// str += String_convert::hex2bin_str( ch_c_l );
+// char const ch_C = "0000" "0006" "0001" "0001" "0060";
+// str += String_convert::hex2bin_str( ch_C );
// *os_p_ << str;
// *this << Midi_header( 1, 1, tempo_i_ );
void
Stem_req::do_print() const
{
+#ifndef NPRINT
Rhythmic_req::do_print();
mtor << "dir : " << dir_i_;
+#endif
}
-Stem_req::Stem_req(int s, int d)
- : Rhythmic_req(s,d)
+Stem_req::Stem_req()
{
dir_i_ = 0;
}
Request::Request()
{
elt_l_ = 0;
- defined_ch_c_l_ = 0;
+ defined_ch_C_ = 0;
}
Request::Request(Request const&src)
{
elt_l_ = 0;
- defined_ch_c_l_ = src.defined_ch_c_l_;
+ defined_ch_C_ = src.defined_ch_C_;
}
/* *************** */
Spacing_req::Spacing_req()
accidental_i_ += delta.accidental_i_;
if (abs(accidental_i_) > 2) {
warning("transposition makes accidental larger than 2",
- delta.defined_ch_c_l_);
+ delta.defined_ch_C_);
}
}
{
return sign(r1.duration() - r2.duration());
}
-Rhythmic_req::Rhythmic_req(int b, int d)
+
+void
+Rhythmic_req::set_duration(Duration d)
{
- plet_factor = 1;
- balltype = b;
- dots = d;
+ duration_ = d;
}
Rhythmic_req::Rhythmic_req()
{
- plet_factor = 1;
- balltype = 1;
- dots = 0;
}
void
Rhythmic_req::do_print() const
{
#ifndef NPRINT
- mtor << "ball: " << balltype ;
- int d =dots;
- while (d--)
- mtor << '.';
-
- mtor<<", plet factor"<<plet_factor<<"\n";
+ mtor << duration_.str();
#endif
}
Moment
Rhythmic_req::duration() const {
- return wholes(balltype,dots)*plet_factor;
+ return duration_.length();
}
/* *************** */
Note_req::do_print() const
{
#ifndef NPRINT
- mtor << " forceacc_b_ " << forceacc_b_ << '\n';
Melodic_req::do_print();
+ mtor << " forceacc_b_ " << forceacc_b_ << '\n';
Rhythmic_req::do_print();
#endif
}
+/*
+ my-lily-lexer.cc -- implement My_lily_lexer
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
#include <strstream.h>
+#include <ctype.h>
#include "interval.hh"
#include "identifier.hh"
#include "assoc-iter.hh"
-#include "input-file.hh"
#include "out/parser.hh"
#include "keyword.hh"
#include "assoc.hh"
keytable_p_ = new Keyword_table(the_key_tab);
identifier_assoc_p_ = new Assoc<String, Identifier*>;
errorlevel_i_ = 0;
+ post_quotes_b_ = false;
+
}
int
return (*identifier_assoc_p_)[s];
}
-char const*
-My_lily_lexer::here_ch_c_l()
-{
- return include_stack_.top()->sourcefile_l_->ch_c_l() + yyin->tellg();
-}
void
My_lily_lexer::add_identifier(Identifier*i)
delete identifier_assoc_p_;
}
void
-My_lily_lexer::print_init_declarations()const
+My_lily_lexer::print_declarations(bool init_b)const
{
for (Assoc_iter<String,Identifier*> ai(*identifier_assoc_p_); ai.ok();
ai++) {
- if (ai.val()->init_b_)
- ai.val()->print();
- }
-}
-void
-My_lily_lexer::print_user_declarations()const
-{
- for (Assoc_iter<String,Identifier*> ai(*identifier_assoc_p_); ai.ok(); ai++) {
- if (!ai.val()->init_b_)
+ if (ai.val()->init_b_ == init_b)
ai.val()->print();
}
}
-String
-My_lily_lexer::spot()const
-{
- return include_stack_.top()->name + ": " + String( lineno() );
-}
-
void
My_lily_lexer::LexerError(char const *s)
{
- if (lexer->include_stack_.empty()) {
+ if (include_stack_.empty()) {
*mlog << "error at EOF" << s << '\n';
} else {
- char const* ch_c_l = here_ch_c_l();
- if ( ch_c_l ) {
- ch_c_l--;
- while ( ( *ch_c_l == ' ' ) || ( *ch_c_l == '\t' ) || ( *ch_c_l == '\n' ) )
- ch_c_l--;
- ch_c_l++;
+ char const* ch_C = here_ch_C();
+ if ( ch_C ) {
+ ch_C--;
+ while (isspace(*ch_C == ' ' ))
+ ch_C--;
+ ch_C++;
}
errorlevel_i_ |= 1;
- error( s, ch_c_l );
+ error( s, ch_C );
}
}
-// set the new input to s, remember old file.
-void
-My_lily_lexer::new_input(String s)
-{
- if (!include_stack_.empty()) {
- include_stack_.top()->line = lineno();
- // should this be saved at all?
- include_stack_.top()->defined_ch_c_l_ = defined_ch_c_l;
- }
-
- Input_file *newin = new Input_file(s);
- include_stack_.push(newin);
- switch_streams(newin->is);
-
- yylineno = 1;
-}
-
-// pop the inputstack.
-bool
-My_lily_lexer::close_input()
-{
- Input_file *old = include_stack_.pop();
- bool ok = true;
- if (include_stack_.empty()) {
- ok = false;
- } else {
- Input_file *i = include_stack_.top();
- switch_streams(i->is);
- yylineno = i->line;
- defined_ch_c_l = i->defined_ch_c_l_;
- }
- delete old;
- return ok;
-}
--- /dev/null
+/*
+ my-lily-parser.cc -- implement
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "my-lily-parser.hh"
+#include "my-lily-lexer.hh"
+#include "debug.hh"
+#include "main.hh"
+#include "voice-element.hh"
+#include "musical-request.hh"
+#include "command-request.hh"
+
+void
+My_lily_parser::set_debug()
+{
+#ifndef NPRINT
+ String s = "";
+ if (init_parse_b_)
+ s = "Init";
+ set_yydebug( !monitor->silence(s+"Parser") && check_debug);
+ lexer_p_->set_debug( !monitor->silence(s+"Lexer") && check_debug);
+#endif
+}
+void
+My_lily_parser::print_declarations()
+{
+#ifndef NPRINT
+ String s = "";
+ if (init_parse_b_)
+ s = "Init";
+ if (!monitor->silence(s+"Declarations") && check_debug) {
+ lexer_p_->print_declarations(init_parse_b_);
+ }
+#endif
+}
+
+void
+My_lily_parser::parse_file(String init, String s)
+{
+ *mlog << "Parsing ... ";
+ lexer_p_ = new My_lily_lexer;
+
+ set_debug();
+
+ lexer_p_->new_input(init, source_l_);
+ do_yyparse();
+ print_declarations();
+
+ init_parse_b_ = false;
+ lexer_p_->new_input(s, source_l_);
+ do_yyparse();
+
+
+ if(!define_spot_array_.empty())
+ warning("Braces don't match.",0);
+}
+
+My_lily_parser::~My_lily_parser()
+{
+ delete lexer_p_;
+}
+
+void
+My_lily_parser::remember_spot()
+{
+ define_spot_array_.push(here_ch_C());
+}
+
+char const *
+My_lily_parser::here_ch_C()const
+{
+ return lexer_p_->here_ch_C();
+}
+
+void
+My_lily_parser::parser_error(String s)
+{
+ lexer_p_->LexerError(s);
+
+ if ( fatal_error_i_ )
+ exit( fatal_error_i_ );
+ error_level_i_ = 1;
+}
+
+void
+My_lily_parser::set_duration_mode(String s)
+{
+ s = s.upper_str();
+ last_duration_mode = (s== "LAST");
+}
+
+void
+My_lily_parser::set_last_duration(Duration const *d)
+{
+ if (last_duration_mode)
+ default_duration_ = *d;
+}
+
+
+Voice_element*
+My_lily_parser::get_word_element(Text_def* tdef_p, Duration * duration_p)
+{
+ Voice_element* velt_p = new Voice_element;
+
+ Lyric_req* lreq_p = new Lyric_req(tdef_p);
+
+ lreq_p->duration_ = *duration_p;
+ lreq_p->print();
+ lreq_p->defined_ch_C_ = here_ch_C();
+
+ velt_p->add(lreq_p);
+
+ delete duration_p;
+ return velt_p;
+}
+
+Voice_element *
+My_lily_parser::get_rest_element(String, Duration * duration_p )
+{
+ Voice_element* velt_p = new Voice_element;
+ velt_p->defined_ch_C_ = lexer_p_->here_ch_C();
+
+ Rest_req * rest_req_p = new Rest_req;
+ rest_req_p->duration_ = *duration_p;
+ rest_req_p->print();
+ rest_req_p->defined_ch_C_ = here_ch_C();
+
+ velt_p->add(rest_req_p);
+ delete duration_p;
+ return velt_p;
+}
+
+Voice_element *
+My_lily_parser::get_note_element(Note_req *rq, Duration * duration_p )
+{
+ Voice_element*v = new Voice_element;
+ v->defined_ch_C_ = here_ch_C();
+
+ if (duration_p->type_i_ >= 2) {
+ Stem_req * stem_req_p = new Stem_req();
+ stem_req_p->duration_ = *duration_p;
+
+ stem_req_p->defined_ch_C_ = here_ch_C();
+ v->add(stem_req_p);
+ }
+
+ rq->set_duration(*duration_p);
+ rq->defined_ch_C_ = here_ch_C();
+
+
+ v->add(rq);
+ delete duration_p ;
+ return v;
+}
+
+Request*
+My_lily_parser::get_parens_request(char c)
+{
+ Request* req_p=0;
+ switch (c) {
+ case '|':
+ req_p = new Barcheck_req;
+ break;
+
+ case '[':
+ case ']':
+ {
+ Beam_req*b = new Beam_req;
+ int p_i=default_duration_.plet_.type_i_ ; // ugh . Should junk?
+ if (p_i!= 1)
+ b->nplet = p_i;
+ req_p = b;
+ }
+ break;
+
+
+ case ')':
+ case '(':
+ req_p = new Slur_req;
+ break;
+ default:
+ assert(false);
+ break;
+ }
+
+ switch (c) {
+ case '(':
+ case '[':
+ req_p->span()->spantype = Span_req::START;
+ break;
+ case ')':
+ case ']':
+ req_p->span()->spantype = Span_req::STOP;
+ break;
+
+ default:
+ break;
+ }
+
+ req_p->defined_ch_C_ = here_ch_C();
+ return req_p;
+}
+
+My_lily_parser::My_lily_parser(Sources * source_l)
+{
+ source_l_ = source_l;
+ lexer_p_ = 0;
+ default_duration_.type_i_ = 4;
+ default_octave_i_=0;
+ textstyle_str_="roman"; // in lexer?
+ error_level_i_ = 0;
+ last_duration_mode = false;
+ defined_ch_C_ = 0;
+ fatal_error_i_ = 0;
+}
+
+void
+My_lily_parser::add_requests(Voice_element*v)
+{
+ for (int i = 0; i < pre_reqs.size(); i++) {
+ v->add(pre_reqs[i]);
+ }
+ pre_reqs.set_size(0);
+ for (int i = 0; i <post_reqs.size(); i++) {
+ v->add(post_reqs[i]);
+ }
+ post_reqs.set_size(0);
+}
#include "parseconstruct.hh"
#include "input-music.hh"
#include "voice-element.hh"
-Moment
-Lexer_prefs::plet_mom()
-{
- return Moment(default_plet_dur, default_plet_type);
-}
-Lexer_prefs::Lexer_prefs()
-{
- default_duration = 4, default_dots=0, default_octave_i_=0;
- default_plet_type = 1, default_plet_dur = 1;
- textstyle_str_="roman"; // in lexer?
-
- last_duration_mode = false;
-}
-
-void
-Lexer_prefs::set_duration_mode(String s)
-{
- s = s.upper_str();
- last_duration_mode = (s== "LAST");
-}
-
-void
-Lexer_prefs::set_last_duration(int n)
-{
- if (last_duration_mode)
- default_duration = n;
-}
-
-/* triplet is '2/3' */
-void
-Lexer_prefs::set_plet(int num,int den)
-{
- assert(num >0&& den>0);
- default_plet_dur = num;
- default_plet_type = den;
-}
-
-Text_def*
-get_text(String s) return t;
-{
- t= new Text_def;
- t->text_str_= s;
- t->style_str_ = lexer->prefs.textstyle_str_;
- t->defined_ch_c_l_ = defined_ch_c_l;
- return t;
-}
-Voice_element *
-get_note_element(Note_req *rq, int * duration )
-{
- Voice_element*v = new Voice_element;
- v->defined_ch_c_l_ = defined_ch_c_l;
-
- int dur = duration[0];
- int dots = duration[1];
-
- if (dur >= 2) {
- Stem_req * stem_req_p = new Stem_req(dur,dots);
- stem_req_p->plet_factor = lexer->prefs.plet_mom();
-
- stem_req_p->defined_ch_c_l_ = defined_ch_c_l;
- v->add(stem_req_p);
- }
-
- if ( !defined_ch_c_l )
- defined_ch_c_l = lexer->here_ch_c_l();
-
- rq->balltype = dur;
- rq->dots = dots;
- rq->plet_factor = lexer->prefs.plet_mom();
-
- rq->defined_ch_c_l_ = defined_ch_c_l;
-
- v->add(rq);
-
- return v;
-}
-
-Voice_element*
-get_word_element(Text_def* tdef_p, int* duration)
-{
- Voice_element* velt_p = new Voice_element;
- velt_p->defined_ch_c_l_ = defined_ch_c_l;
-
- int dur = duration[0];
- int dots=duration[1];
-
- tdef_p->defined_ch_c_l_ = defined_ch_c_l;
-
- Lyric_req* lreq_p = new Lyric_req(tdef_p);
-
- lreq_p->balltype = dur;
- lreq_p->dots = dots;
- lreq_p->plet_factor = lexer->prefs.plet_mom();
- lreq_p->print();
- lreq_p->defined_ch_c_l_ = defined_ch_c_l;
-
- velt_p->add(lreq_p);
-
- return velt_p;
-}
-Voice_element *
-get_rest_element(String, int * duration )
-{
- Voice_element* velt_p = new Voice_element;
- velt_p->defined_ch_c_l_ = defined_ch_c_l;
-
- Rest_req * rest_req_p = new Rest_req;
- rest_req_p->plet_factor = lexer->prefs.plet_mom();
- rest_req_p->balltype = duration[0];
- rest_req_p->dots = duration[1];
- rest_req_p->print();
- rest_req_p->defined_ch_c_l_ = defined_ch_c_l;
-
- velt_p->add(rest_req_p);
-
- return velt_p;
-}
-
-void
-Lexer_prefs::get_default_duration(int *p)
-{
- *p++ = default_duration;
- *p = default_dots;
-}
-
-void
-Lexer_prefs::set_default_duration(int *p)
-{
- default_duration = *p++;
- default_dots = *p++;
-}
Request*
get_plet_request( char c, int dur_i, int type_i )
return plet_req_p;
}
-Request*
-get_request(char c)
-{
- Request* req_p=0;
- switch (c) {
- case '|':
- req_p = new Barcheck_req;
- break;
-
- case '[':
- case ']':
- {
- Beam_req*b = new Beam_req;
- int p_i=lexer->prefs.default_plet_type ;
- if (p_i!= 1)
- b->nplet = p_i;
- req_p = b;
- }
- break;
-
-
- case ')':
- case '(':
- req_p = new Slur_req;
- break;
- default:
- assert(false);
- break;
- }
-
- switch (c) {
- case '(':
- case '[':
- req_p->span()->spantype = Span_req::START;
- break;
- case ')':
- case ']':
- req_p->span()->spantype = Span_req::STOP;
- break;
-
- default:
- break;
- }
-
- req_p->defined_ch_c_l_ = req_defined_ch_c_l;
- return req_p;
-}
void
add_requests(Voice_element *v, Array<Request*> &req)
}
req.set_size(0);
}
-
-Script_def*
+String *
get_scriptdef(char c)
{
String s;
case '.' : s = "staccato";
break;
}
- return lexer->lookup_identifier(s)->script(1);
+ return new String(s);
}
Request*
void
Notehead::set_rhythmic(Rhythmic_req*r_req_l)
{
- balltype = r_req_l->balltype;
- dots = r_req_l->dots;
+ balltype = r_req_l->duration_.type_i_;
+ dots = r_req_l->duration_.dots_i_;
}
void
%{ // -*-Fundamental-*-
#include <iostream.h>
+
+
#include "script-def.hh"
#include "symtable.hh"
#include "lookup.hh"
#include "command-request.hh"
#include "musical-request.hh"
#include "voice-element.hh"
+#include "my-lily-parser.hh"
+#include "text-def.hh"
#ifndef NDEBUG
#define YYDEBUG 1
#endif
-Array<Request*> pre_reqs, post_reqs;
-Array<const char *> define_spots;
-Paper_def*default_paper();
-char const* defined_ch_c_l;
-char const* req_defined_ch_c_l;
-int fatal_error_i = 0;
-bool init_parse_b;
+#define YYERROR_VERBOSE 1
+
+#define YYPARSE_PARAM my_lily_parser_l
+#define YYLEX_PARAM my_lily_parser_l
+#define THIS ((My_lily_parser *) my_lily_parser_l)
+
+#define yyerror THIS->parser_error
+
%}
%union {
- Array<Melodic_req*> *melreqvec;
+ Array<Melodic_req*> *melreqvec;/* should clean up naming */
Array<String> * strvec;
Array<int> *intvec;
Box *box;
+ Duration *duration;
Identifier *id;
Input_music *music;
Input_score *score;
int i;
int ii[10];
}
+%{
+
+int
+yylex(YYSTYPE *s, void * v_l)
+{
+ My_lily_parser *pars_l = (My_lily_parser*) v_l;
+ My_lily_lexer * lex_l = pars_l->lexer_p_;
+ lex_l->lexval_l = (void*) s;
+ return lex_l->yylex();
+}
+
+
+%}
+%pure_parser
+
+/* tokens which are not keywords */
+%token CONCAT
%token BAR
%token CADENZA
%token CLEF
%token CM_T
-%token CONCAT
%token DURATIONCOMMAND
%token DYNAMIC
%token END
%token <real> REAL
%token <string> DURATION RESTNAME
%token <string> STRING
+%token <i> POST_QUOTES
+%token <i> PRE_QUOTES
+
%type <box> box
%type <c> open_request_parens close_request_parens close_plet_parens
%type <chord> music_chord music_chord_body init_music_chord
%type <el> voice_elt full_element lyrics_elt command_elt
%type <i> int
-%type <i> octave_quotes octave_quote
%type <i> script_dir
%type <id> declaration
-%type <ii> default_duration explicit_duration notemode_duration
-%type <ii> mudela_duration
+%type <duration> explicit_duration notemode_duration
%type <interval> dinterval
%type <intvec> intastint_list
%type <lookup> symtables symtables_body
%type <script> script_definition script_body mudela_script
%type <staff> staff_block staff_init staff_body
%type <string> declarable_identifier
+%type <string> script_abbreviation
+%type <id> old_identifier
%type <symbol> symboldef
%type <symtable> symtable symtable_body
%type <textdef> mudela_text
add_score($2);
}
| mudela add_declaration { }
+ | mudela error
;
DECLARATIONS
*/
add_declaration: declaration {
- lexer->add_identifier($1);
- $1->init_b_ = init_parse_b;
- $1->defined_ch_C_ = define_spots.pop();
+ THIS->lexer_p_->add_identifier($1);
+ $1->init_b_ = THIS->init_parse_b_;
+ $1->defined_ch_C_ = THIS->define_spot_array_.pop();
}
;
declarable_identifier:
STRING {
- define_spots.push(lexer->here_ch_c_l());
+ THIS->remember_spot();
$$ = $1;
- if (lexer->lookup_identifier(*$1))
- warning("redeclaration of `" + *$1 + "'",
- lexer->here_ch_c_l());
}
- | IDENTIFIER {
- define_spots.push(lexer->here_ch_c_l());
+ | old_identifier {
+ THIS->remember_spot();
$$ = new String($1->name);
+ warning("redeclaration of `" + *$$ + "'", THIS->here_ch_C());
}
;
+
+old_identifier:
+ IDENTIFIER
+ | MELODIC_REQUEST_IDENTIFIER
+ | CHORD_IDENTIFIER
+ | VOICE_IDENTIFIER
+ | POST_REQUEST_IDENTIFIER
+ | SCRIPT_IDENTIFIER
+ | STAFF_IDENTIFIER
+ | REAL_IDENTIFIER
+ | SCORE_IDENTIFIER
+ | REQUEST_IDENTIFIER
+ ;
+
declaration:
declarable_identifier '=' score_block {
$$ = new Score_id(*$1, $3, SCORE_IDENTIFIER);
$$ = new Real_id(*$1, new Real($3), REAL_IDENTIFIER);
delete $1;
}
- | declarable_identifier error '}' {
-
- }
+
| declarable_identifier '=' pure_post_request {
$$ = new Request_id(*$1, $3, POST_REQUEST_IDENTIFIER);
delete $1;
SCORE
*/
score_block:
- SCORE { define_spots.push(lexer->here_ch_c_l()); }
+ SCORE { THIS->remember_spot(); }
/*cont*/ '{' score_body '}' {
$$ = $4;
- $$->defined_ch_c_l_ = define_spots.pop();
+ $$->defined_ch_C_ = THIS->define_spot_array_.pop();
if (!$$->paper_p_ && ! $$->midi_p_)
- $$->paper_p_ = default_paper();
+ $$->paper_p_ = THIS->default_paper();
/* handle error levels. */
- $$->errorlevel_i_ = lexer->errorlevel_i_;
- lexer->errorlevel_i_ = 0;
+ $$->errorlevel_i_ = THIS->error_level_i_;
+ THIS->error_level_i_ = 0;
}
;
paper_body:
/* empty */ {
- $$ = default_paper();
+ $$ = THIS->default_paper();
+
}
| paper_body WIDTH dim { $$->linewidth = $3;}
| paper_body OUTPUT STRING { $$->outfile = *$3;
$$->outfile_str_ = *$3;
delete $3;
}
- | midi_body TEMPO mudela_duration ':' int {
- $$->set_tempo( wholes( $3[0], $3[1] ), $5 );
+ | midi_body TEMPO notemode_duration ':' int {
+ $$->set_tempo( $3->length(), $5 );
}
| midi_body error {
STAFFs
*/
staff_block:
- STAFF { define_spots.push(lexer->here_ch_c_l()); }
+ STAFF { THIS->remember_spot(); }
/*cont*/ '{' staff_body '}' {
$$ = $4;
- $$-> defined_ch_c_l_ = define_spots.pop();
+ $$-> defined_ch_C_ = THIS->define_spot_array_.pop();
}
;
;
init_lyrics_voice:
- LYRICS { lexer->push_lyric_state(); }
- music_voice { $$ = $3; lexer->pop_state(); }
+ LYRICS { THIS->lexer_p_->push_lyric_state(); }
+ music_voice { $$ = $3; THIS->lexer_p_->pop_state(); }
;
init_music_voice:
- MUSIC { lexer->push_note_state(); }
+ MUSIC { THIS->lexer_p_->push_note_state(); }
/* cont*/ music_voice
- { $$=$3; lexer->pop_state(); }
+ { $$=$3; THIS->lexer_p_->pop_state(); }
;
init_music_chord:
- MUSIC { lexer->push_note_state(); }
+ MUSIC { THIS->lexer_p_->push_note_state(); }
/* cont*/ music_chord
- { $$=$3; lexer->pop_state(); }
+ { $$=$3; THIS->lexer_p_->pop_state(); }
;
/*
MUSIC
| music_voice_body error {
}
| music_voice_body '>' {
- fatal_error_i = 1;
- yyerror("Confused by errors: bailing out");
+ THIS->fatal_error_i_ = 1;
+ THIS->parser_error("Confused by errors: bailing out");
};
music_chord: '<' music_chord_body '>' { $$ = $2; }
$$ ->add_elt($2);
}
| music_chord_body '}' {
- fatal_error_i = 1;
- yyerror("Confused by errors: bailing out");
+ THIS->fatal_error_i_ = 1;
+ THIS->parser_error("Confused by errors: bailing out");
}
| music_chord_body error {
}
VOICE ELEMENTS
*/
full_element: pre_requests voice_elt post_requests {
- add_requests($2, pre_reqs);
- add_requests($2, post_reqs);
+ THIS->add_requests($2);
$$ = $2;
}
| pre_requests lyrics_elt post_requests {
- add_requests($2, pre_reqs);
- add_requests($2, post_reqs);
+ THIS->add_requests($2);
$$ = $2;
}
| command_elt
- ;
+ ;
command_elt:
/* empty */ {
$$ = new Voice_element;
- $$-> defined_ch_c_l_ = lexer->here_ch_c_l();
+ $$-> defined_ch_C_ = THIS->here_ch_C();
}
/* cont: */
command_req {
- $2-> defined_ch_c_l_ = $$->defined_ch_c_l_;
+ $2-> defined_ch_C_ = $$->defined_ch_C_;
$$->add($2);
}
post_requests:
{
- assert(post_reqs.empty());
+ assert(THIS->post_reqs.empty());
}
| post_requests post_request {
- $2->defined_ch_c_l_ = lexer->here_ch_c_l();
- post_reqs.push($2);
+ $2->defined_ch_C_ = THIS->here_ch_C();
+ THIS->post_reqs.push($2);
}
| post_requests close_plet_parens INT '/' INT {
- post_reqs.push( get_request($2) );
- req_defined_ch_c_l = lexer->here_ch_c_l();
- post_reqs.push( get_plet_request( $2, $3, $5 ) );
+ THIS->post_reqs.push( THIS->get_parens_request($2) );
+ THIS->post_reqs.push( get_plet_request( $2, $3, $5 ) );
}
;
pure_post_request:
close_request_parens {
- $$ = get_request($1);
+ $$ = THIS->get_parens_request($1);
}
| script_req
| textscript_req
;
-octave_quote:
- '\'' { $$ = 1; }
- | '`' { $$ = -1 ; }
- ;
-
-octave_quotes:
- /**/ { $$ = 0; }
- | octave_quotes octave_quote{ $$ += $2; }
- ;
/*
URG!!
steno_melodic_req:
MELODIC_REQUEST_IDENTIFIER {
$$ = $1->request(false)->clone()->melodic();
- $$->octave_i_ += lexer->prefs.default_octave_i_;
+ $$->octave_i_ += THIS->default_octave_i_;
}
- | steno_melodic_req '\'' {
- $$-> octave_i_ ++;
+ | steno_melodic_req POST_QUOTES {
+ $$-> octave_i_ += $2;
}
- | '`' steno_melodic_req {
+ | PRE_QUOTES steno_melodic_req {
$$ = $2;
- $2-> octave_i_ --;
+ $2-> octave_i_ -= $1;
}
;
close_plet_parens:
']' {
- req_defined_ch_c_l = lexer->here_ch_c_l();
+ //req_defined_ch_C = THIS->here_ch_C();
$$ = ']';
}
;
mudela_text:
STRING {
- defined_ch_c_l = lexer->here_ch_c_l();
- $$ = get_text(*$1);
+ //defined_ch_C = THIS->here_ch_C();
+ $$ = new Text_def;
+ $$->text_str_ = *$1;
delete $1;
+ $$->style_str_ = THIS->textstyle_str_;
}
;
$$ = get_script_req($1, $2);
}
;
-
-mudela_script:
- SCRIPT_IDENTIFIER { $$ = $1->script(true); }
- | script_definition { $$ = $1; }
- | '^' { $$ = get_scriptdef('^'); }
+script_abbreviation:
+ '^' { $$ = get_scriptdef('^'); }
| '+' { $$ = get_scriptdef('+'); }
| '-' { $$ = get_scriptdef('-'); }
| '|' { $$ = get_scriptdef('|'); }
| 'o' { $$ = get_scriptdef('o'); }
| '>' { $$ = get_scriptdef('>'); }
- | '.' { $$ = get_scriptdef('.'); }
| DOTS {
if ( $1 > 1 )
- warning( "too many staccato dots", lexer->here_ch_c_l() );
+ warning( "too many staccato dots", THIS->here_ch_C() );
$$ = get_scriptdef('.');
}
- | error {
- $$ = get_scriptdef('.');
- yyerrok;
+ ;
+
+mudela_script:
+ SCRIPT_IDENTIFIER { $$ = $1->script(true); }
+ | script_definition { $$ = $1; }
+ | script_abbreviation {
+ $$ = THIS->lexer_p_->lookup_identifier(*$1)->script(true);
+ delete $1;
}
;
pre_requests:
| pre_requests pre_request {
- pre_reqs.push($2);
- $2->defined_ch_c_l_ = lexer->here_ch_c_l();
+ THIS->pre_reqs.push($2);
+ $2->defined_ch_C_ = THIS->here_ch_C();
}
;
pre_request:
open_request_parens {
- defined_ch_c_l = lexer->here_ch_c_l();
- $$ = get_request($1);
+ //defined_ch_C = THIS->here_ch_C();
+ $$ = THIS->get_parens_request($1);
}
;
voice_command:
PLET '{' INT '/' INT '}' {
- lexer->prefs.set_plet($3,$5);
+ THIS->default_duration_.set_plet($3,$5);
}
| DURATIONCOMMAND '{' STRING '}' {
- lexer->prefs.set_duration_mode(*$3);
+ THIS->set_duration_mode(*$3);
delete $3;
}
| DURATIONCOMMAND '{' notemode_duration '}' {
- lexer->prefs.set_default_duration($3);
+ THIS->default_duration_ = *$3;
+ delete $3;
}
- | OCTAVECOMMAND '{' octave_quotes '}' {
- lexer->prefs.default_octave_i_ = $3;
+ | OCTAVECOMMAND '{' int '}' {
+ THIS->default_octave_i_ = $3;
}
| TEXTSTYLE STRING {
- lexer->prefs.textstyle_str_ = *$2;
+ THIS->textstyle_str_ = *$2;
delete $2;
}
;
duration_length:
- mudela_duration {
- $$ = new Moment(wholes($1[0], $1[1]));
+ {
+ $$ = new Moment(0,1);
}
- |int '*' mudela_duration {
- $$ = new Moment(Rational($1) * wholes($3[0], $3[1]));
+ | duration_length explicit_duration {
+ *$$ += $2->length();
}
;
notemode_duration:
- explicit_duration
- | default_duration
- ;
-
-mudela_duration:
- int {
- $$[0] = $1;
- $$[1] = 0;
+ /* */ {
+ $$ = new Duration(THIS->default_duration_);
}
- | int DOTS {
- $$[0] = $1;
- $$[1] = $2;
+ | DOTS {
+ $$ = new Duration(THIS->default_duration_);
+ $$->dots_i_ = $1;
+ }
+ | explicit_duration {
+ THIS->set_last_duration($1);
+ $$ = $1;
}
;
-
explicit_duration:
- INT {
- lexer->prefs.set_last_duration($1);
- $$[0] = $1;
- $$[1] = 0;
- }
- | INT DOTS {
- lexer->prefs.set_last_duration($1);
- $$[0] = $1;
- $$[1] = $2;
+ int {
+ $$ = new Duration;
+ $$->type_i_ = $1;
}
- | DOTS {
- lexer->prefs.get_default_duration($$);
- $$[1] = $1;
+ | explicit_duration DOTS {
+ $$->dots_i_ = $2;
}
- | INT '*' INT '/' INT {
- // ugh, must use Duration
- lexer->prefs.set_plet( $3, $5 );
- $$[ 0 ] = $1;
- $$[ 1 ] = 0;
- lexer->prefs.set_plet( 1, 1 );
+ | explicit_duration '*' int {
+ $$->plet_.iso_i_ *= $3;
}
- ;
-
-default_duration:
- /* empty */ {
- lexer->prefs.get_default_duration($$);
+ | explicit_duration '/' int {
+ $$->plet_.type_i_ *= $3;
}
;
voice_elt:
steno_note_req notemode_duration {
- if (!lexer->note_state_b())
- yyerror("have to be in Note mode for notes");
- $$ = get_note_element($1, $2);
+ if (!THIS->lexer_p_->note_state_b())
+ THIS->parser_error("have to be in Note mode for notes");
+ $$ = THIS->get_note_element($1, $2);
}
| RESTNAME notemode_duration {
- $$ = get_rest_element(*$1, $2);
+ $$ = THIS->get_rest_element(*$1, $2);
delete $1;
}
;
lyrics_elt:
mudela_text notemode_duration {
- if (!lexer->lyric_state_b())
- yyerror("Have to be in Lyric mode for lyrics");
- $$ = get_word_element($1, $2);
+ if (!THIS->lexer_p_->lyric_state_b())
+ THIS->parser_error("Have to be in Lyric mode for lyrics");
+ $$ = THIS->get_word_element($1, $2);
};
%%
-void
-yyerror(const char *s)
+void
+My_lily_parser::set_yydebug(bool b )
{
- lexer->LexerError(s);
-
- if ( fatal_error_i )
- exit( fatal_error_i );
+#ifdef YYDEBUG
+ yydebug = b;
+#endif
}
-
void
-parse_file(String init, String s)
+My_lily_parser::do_yyparse()
{
- *mlog << "Parsing ... ";
- lexer = new My_lily_lexer;
-
-#ifndef NPRINT
- yydebug = !monitor->silence("InitParser") && check_debug;
- lexer->set_debug( !monitor->silence("InitLexer") && check_debug);
-#endif
- init_parse_b = true;
- lexer->new_input(init);
- yyparse();
-
-#ifndef NPRINT
- if (!monitor->silence("InitDeclarations") && check_debug)
- lexer->print_init_declarations();
-
- yydebug = !monitor->silence("Parser") && check_debug;
- lexer->set_debug( !monitor->silence("Lexer") && check_debug);
-#endif
- init_parse_b = false;
- lexer->new_input(s);
- yyparse();
-
-#ifdef NPRINT
- if (!monitor->silence("Declarations") && check_debug)
- lexer->print_user_declarations();
-#endif
- delete lexer;
- lexer = 0;
-
- if(!define_spots.empty())
- warning("Braces don't match.",0);
+ yyparse((void*)this);
}
Paper_def*
-default_paper()
+My_lily_parser::default_paper()
{
return new Paper_def(
- lexer->lookup_identifier("default_table")->lookup(true));
+ lexer_p_->lookup_identifier("default_table")->lookup(true));
}
-
+/*
+ rest.cc -- implement Rest
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+#include "duration.hh"
#include "rest.hh"
#include "dimen.hh"
#include "debug.hh"
#include "paper-def.hh"
#include "lookup.hh"
#include "molecule.hh"
+#include "rest.hh"
-
-Rest::Rest(int t, int d)
+Rest::Rest(Duration d)
{
- balltype = t;
- dots = d;
+ balltype = d.type_i_;
+ dots = d.dots_i_;
+ pos_i_ = 0;
}
dm.add(Atom(d));
m->add_right(dm);
}
+ m->translate(Offset(0,pos_i_ * paper()->internote()));
return m;
}
*mlog << "\nSetting up music ..." << flush;
if (last() == Moment(0)) {
errorlevel_i_ |= 1;
- error("Need to have music in a score.", defined_ch_c_l_);
+ error("Need to have music in a score.", defined_ch_C_);
}
for (iter_top(staffs_,i); i.ok(); i++) {
paper_p_ = 0;
midi_p_ = 0;
errorlevel_i_ = 0;
- defined_ch_c_l_ = 0;
+ defined_ch_C_ = 0;
}
Score::~Score()
the_output << "% outputting Score, defined at: " <<
source_l_g->
- sourcefile_l (defined_ch_c_l_)->file_line_no_str(defined_ch_c_l_) << "\n";
+ sourcefile_l (defined_ch_C_)->file_line_no_str(defined_ch_C_) << "\n";
pscore_p_->output(the_output);
}
Input_score* &is_p = score_array_global[i];
if (is_p->errorlevel_i_) {
warning("Score contains errors. Will not process it. ",
- is_p->defined_ch_c_l_);
+ is_p->defined_ch_C_);
delete is_p;
continue;
}
if (slur_req_l->spantype == Span_req::STOP) {
if (slur_l_stack_.empty())
warning("can't find slur to end",
- slur_req_l->defined_ch_c_l_);
+ slur_req_l->defined_ch_C_);
else {
end_slur_l_arr_.push(slur_l_stack_.pop());
requests_arr_.pop();
Slur_register::~Slur_register()
{
for (int i=0; i < requests_arr_.size(); i++) {
- warning("unterminated slur", requests_arr_[i]->defined_ch_c_l_);
+ warning("unterminated slur", requests_arr_[i]->defined_ch_C_);
}
}
if (tr_l->partial()) {
time_.setpartial(tr_l->partial()->duration_);
} else if (tr_l->barcheck() && time_.whole_in_measure_) {
- warning( "Barcheck failed", tr_l->defined_ch_c_l_ );
+ warning( "Barcheck failed", tr_l->defined_ch_C_ );
} else if (tr_l->cadenza()) {
time_.set_cadenza(tr_l->cadenza()->on_b_);
} else if (tr_l->measuregrouping()) {
if ( req_l->stem() ) {
if (current_grouping && !current_grouping->child_fit_query(
- get_staff_info().time_c_l_->whole_in_measure_))
+ get_staff_info().time_C_->whole_in_measure_))
return false;
if (stem_req_l_ && Stem_req::compare(*stem_req_l_, *req_l->stem()))
stem_p_ = new Stem(4);
if (current_grouping)
current_grouping->add_child(
- get_staff_info().time_c_l_->whole_in_measure_,
+ get_staff_info().time_C_->whole_in_measure_,
stem_req_l_->duration());
- stem_p_->flag = stem_req_l_->balltype;
+ stem_p_->flag = stem_req_l_->duration_.type_i_;
if (beam_p_) {
- if (stem_req_l_->balltype<= 4)
+ if (stem_req_l_->duration_.type_i_<= 4)
warning( "stem doesn't fit in Beam",
- stem_req_l_->defined_ch_c_l_);
+ stem_req_l_->defined_ch_C_);
else
beam_p_->add(stem_p_);
stem_p_->print_flag = false;
stem_p_ = 0;
}
if (beam_p_ && end_beam_b_) {
- Rhythmic_grouping const * rg_c_l = get_staff_info().rhythmic_c_l_;
- rg_c_l->extend(current_grouping->interval());
- beam_p_->set_grouping(*rg_c_l, *current_grouping);
+ Rhythmic_grouping const * rg_C = get_staff_info().rhythmic_C_;
+ rg_C->extend(current_grouping->interval());
+ beam_p_->set_grouping(*rg_C, *current_grouping);
typeset_element(beam_p_);
delete current_grouping;
current_grouping = 0;
Stem_beam_register::~Stem_beam_register()
{
if (beam_p_)
- warning("unterminated beam", start_req_l_->defined_ch_c_l_);
+ warning("unterminated beam", start_req_l_->defined_ch_C_);
}
void
#include "input-staff.hh"
#include "input-music.hh"
#include "molecule.hh"
-#include "source-file.hh"
#include "voice-element.hh"
#include "plist.tcc"
#include "pcursor.tcc"
-IPL_instantiate(Atom);
IPL_instantiate(Atom);
IPL_instantiate(Input_staff);
IPL_instantiate(Input_music);
-IPL_instantiate(Source_file);
*os << "% Creator: " << get_version_str();
*os << "% Automatically generated, at ";
time_t t(time(0));
- *os << ctime(&t);
- *os << "% from musical definition: " + infile_str_g + "\n";
+ *os << ctime(&t)<<"\n";
}
Tex_stream::~Tex_stream()
{
{
align_i_ = 1; // right
style_str_ = "roman";
- defined_ch_c_l_ = 0;
+ defined_ch_C_ = 0;
}
bool
Text_def::compare(Text_def const &def)
{
voice_l_ = 0;
duration = 0;
- defined_ch_c_l_ = 0;
+ defined_ch_C_ = 0;
}
Voice_element::Voice_element(Voice_element const&src)
{
- defined_ch_c_l_ = src.defined_ch_c_l_;
+ defined_ch_C_ = src.defined_ch_C_;
voice_l_=0;
for (iter_top(src.reqs, i); i.ok(); i++)
for ( PCursor<Request*> i( reqs.top() ); i.ok(); i++ ) {
if (i->beam() && i->beam()->spantype == Span_req::START )
i->beam()->nplet = den_i;
- if (i->rhythmic())
- i->rhythmic()->plet_factor = Moment(num_i, den_i);
- if (i->stem())
- i->stem()->plet_factor = Moment(num_i, den_i);
+ if (i->rhythmic()) {
+ i->rhythmic()->duration_.plet_.type_i_ = den_i;
+ i->rhythmic()->duration_.plet_.iso_i_ = num_i;
+
+ }
}
}
change_group(cr_l->groupchange(), 0, 0);
} else
warning("junking request: " + String(r->name()),
- r->defined_ch_c_l_);
+ r->defined_ch_C_);
}
return b;
}
inf.break_allowed_b_ = walk_l_->score_walk_l_->break_allowed_b();
inf.c0_position_i_ = &walk_l_->c0_position_i_;
inf.walk_l_ = walk_l_;
- inf.time_c_l_ = &walk_l_->time_;
- inf.rhythmic_c_l_ = walk_l_->default_grouping;
+ inf.time_C_ = &walk_l_->time_;
+ inf.rhythmic_C_ = walk_l_->default_grouping;
}
Paper_def*
void
error(String s)
{
- if (busy_parsing())
- yyerror(s);
- else
- cerr << "error: " << s << "\n";
+ cerr << "error: " << s << "\n";
exit(1);
}
}
void
-message( String message_str, char const* context_ch_c_l )
+message( String message_str, char const* context_ch_C )
{
String str = ""; //"lilypond: ";// GNU format messages!
- Source_file* sourcefile_l = source_l_g->sourcefile_l( context_ch_c_l );
+ Source_file* sourcefile_l = source_l_g->sourcefile_l( context_ch_C );
if ( sourcefile_l ) {
- str += sourcefile_l->file_line_no_str(context_ch_c_l) + String(": ");
+ str += sourcefile_l->file_line_no_str(context_ch_C) + String(": ");
}
str += message_str;
if ( sourcefile_l ) {
str += ":\n";
- str += sourcefile_l->error_str( context_ch_c_l );
+ str += sourcefile_l->error_str( context_ch_C );
}
if ( busy_parsing() )
cerr << endl;
}
void
-warning( String message_str, char const* context_ch_c_l )
+warning( String message_str, char const* context_ch_C )
{
- message( "warning: " + message_str, context_ch_c_l );
+ message( "warning: " + message_str, context_ch_C );
}
void
-error( String message_str, char const* context_ch_c_l )
+error( String message_str, char const* context_ch_C )
{
- message( message_str, context_ch_c_l );
+ message( message_str, context_ch_C );
// since when exits error again?
// i-d say: error: errorlevel |= 1; -> no output upon error
// warning: recovery -> output (possibly wrong)
- if ( lexer )
- lexer->errorlevel_i_ |= 1;
+/* if ( lexer )
+ lexer->errorlevel_i_ |= 1;*/
// exit( 1 );
}
mv $(shell basename $@ .hh ).tab.c $(outdir)/$(shell basename $@ .hh).cc
$(outdir)/%.cc: %.l
- $(FLEX) -t $< > $@
+ $(FLEX) -Cfe -p -p -t $< > $@
$(outdir)/%.text: $(outdir)/%.1
groff -man -Tascii $< > $@
%/.build:
echo 0 >$@
-
-# specific stuff:
-#
-$(LIBFLOWER): check-flower-deps
-
-check-flower-deps:
- $(MAKE) -C $(depth)/flower/ $(outdir)/$(notdir $(LIBFLOWER))
-
-check-lily-deps: check-flower-deps
- $(MAKE) -C $(depth)/lib
-
-check-doc-deps:
- $(MAKE) -C $(depth)/Documentation
-
-$(LIBLILY): dummy
- $(MAKE) ./$(outdir)/$(@F) -C $(depth)/lib
-#
-
EXECUTABLE = $(lily_bindir)/$(NAME)
$(EXECUTABLE): $(build) $(OFILES) $(CUSTOMLIBES)
$(INCREASE_BUILD)
- $(MAKE) $(OFILES) $(SILENT_LOG)
+ $(MAKE) -S $(OFILES) $(SILENT_LOG)
# $(STRIPDEBUG) $(STABLEOBS)
$(LD_COMMAND) $(OFILES) $(LOADLIBES)
set -e; for i in $(SUBDIRS); do $(MAKE) localdir=$(localdir)/$$i -C $$i localmoduledist; done
endif
-all-tags: TAGS
-ifdef SUBDIRS
- set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i all-tags; done
-endif
-
-TAGS: $(all-tag-sources)
+TAGS:$(all-tag-sources)
ifdef all-tag-sources
-etags -CT $(all-tag-sources) /dev/null
endif
+ifdef SUBDIRS
+ set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i TAGS ; done
+endif
+
# version stuff:
#
-out/version.hh: .version
+$(outdir)/version.hh: .version
./$(lily_bindir)/make_version > $@
endif
localuninstall:
+
+# specific stuff:
+#
+$(LIBFLOWER): check-flower-deps
+
+check-flower-deps:
+ $(MAKE) -C $(depth)/flower/ $(outdir)/$(notdir $(LIBFLOWER))
+
+check-lily-deps: check-flower-deps
+ $(MAKE) -C $(depth)/lib
+
+check-doc-deps:
+ $(MAKE) -C $(depth)/Documentation
+
+$(LIBLILY): dummy
+ $(MAKE) ./$(outdir)/$(@F) -C $(depth)/lib
+#
+
ERROR_LOG = 2> /dev/null
SILENT_LOG = >& /dev/null
allexe = $(lily_bindir)/lilypond $(lily_bindir)/mi2mu
+allhh := $(shell $(FIND) -name "*.hh" $(ERROR_LOG))
allcc := $(shell $(FIND) -name "*.cc" $(ERROR_LOG))
allobs := $(shell $(FIND) $(outdir) -name "*.o" $(ERROR_LOG))
allibs := $(shell $(FIND) $(libdir) -name "*.lib" $(ERROR_LOG))
INCLUDES = -Iinclude -I$(outdir) -I$(include-lib) -I$(libout) -I$(include-flower) -I$(flowerout)
CXX_OUTPUT_OPTION = $< -o $@
LDFLAGS = $(EXTRA_LDFLAGS)
-LOADLIBES = $(EXTRA_LIBES) $(CUSTOMLIBES) -lg++
+LOADLIBES = $(EXTRA_LIBES) $(CUSTOMLIBES)
#
# librarian:
STRIPDEBUG=true #replace to do stripping of certain objects
DISTFILES=$(EXTRA_DISTFILES) Makefile $(ALL_SOURCES)
+DOCDIR=$(depth)/doc++
+
+
+progdocs=$(allhh) $(allcc)
Summary: A preprocessor to make TeX typeset music.
URL: http://www.stack.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@stack.nl>
-Icon: lelie_logo.gif
+Icon: lelie_icon.gif
%description
LilyPond is a program which converts a music-script (mudela) into
#include "lgetopt.hh"
#include "moment.hh"
+#include "duration-convert.hh"
#include "duration.hh"
-#include "input-file.hh"
#include "source-file.hh"
#include "source.hh"
#define qtor if ( level_ver >= QUIET_ver ) *monitor_p_g
#endif
-extern Source* source_l_g;
-void message( String message_str, char const* context_ch_c_l );
-void warning( String message_str, char const* context_ch_c_l );
-void error( String message_str, char const* context_ch_c_l );
+extern Sources* source_l_g;
+void message( String message_str, char const* context_ch_C );
+void warning( String message_str, char const* context_ch_C );
+void error( String message_str, char const* context_ch_C );
String mi2mu_version_str();
int yylex();
void yyerror(const char *s);
-// bool busy_parsing();
-// void kill_lexer();
-// void set_lexer();
/// (midi_lexer)
class My_midi_lexer : yyFlexLexer {
public:
- My_midi_lexer( String filename_str );
+ My_midi_lexer( String &filename_str ,Sources * );
~My_midi_lexer();
int close_i();
void error( char const* sz_l );
- char const* here_ch_c_l();
+ char const* here_ch_C();
static int varint2_i( String str );
int yylex();
-
+ Source_file * source_file_p_ ;
private:
- Input_file* input_file_p_;
-
+ int char_count_;
public: // ugh
int errorlevel_i_;
};
#ifndef MY_MIDI_PARSER_HH
#define MY_MIDI_PARSER_HH
-// #include "proto.hh"
-// #include "string.hh"
int yyparse();
-/// (midi_parser)
+/**
+ An interface to the YACC midi parser.
+ (midi_parser)
+ */
class My_midi_parser {
public:
- My_midi_parser( String filename_str );
- ~My_midi_parser();
-
- void add_score( Midi_score* midi_score_p );
- void error( char const* sz_l );
- int parse();
- void forward( int i );
- Moment mom();
- void note_begin( int channel_i, int pitch_i, int dyn_i );
- Midi_event* note_end_midi_event_p( int channel_i, int pitch_i, int dyn_i );
- int output_mudela( String filename_str );
- void reset();
- void set_division_4( int division_4_i );
- void set_key( int accidentals_i, int minor_i );
- void set_tempo( int useconds_per_4_i );
- void set_time( int num_i, int den_i, int clocks_i, int count_32_i );
-
- int bar_i_;
- int track_i_;
- String filename_str_;
- String copyright_str_;
- String instrument_str_;
- String track_name_str_;
-
- Midi_key* midi_key_p_;
- Midi_tempo* midi_tempo_p_;
- Midi_time* midi_time_p_;
+ My_midi_parser( String filename_str,Sources * );
+ ~My_midi_parser();
+
+ void add_score( Midi_score* midi_score_p );
+ void error( char const* sz_l );
+ int parse();
+ void forward( int i );
+ Moment mom();
+ void note_begin( int channel_i, int pitch_i, int dyn_i );
+ Midi_event* note_end_midi_event_p( int channel_i, int pitch_i, int dyn_i );
+ int output_mudela( String filename_str );
+ void reset();
+ void set_division_4( int division_4_i );
+ void set_key( int accidentals_i, int minor_i );
+ void set_tempo( int useconds_per_4_i );
+ void set_time( int num_i, int den_i, int clocks_i, int count_32_i );
+
+ int bar_i_;
+ int track_i_;
+ String filename_str_;
+ String copyright_str_;
+ String instrument_str_;
+ String track_name_str_;
+
+ Midi_key* midi_key_p_;
+ Midi_tempo* midi_tempo_p_;
+ Midi_time* midi_time_p_;
private:
- I64 now_i64_; // 31 bits yields tipically about 1000 bars
+ I64 now_i64_; // 31 bits yields tipically about 1000 bars
- static int const CHANNELS_i = 16;
- static int const PITCHES_i = 128;
- I64 running_i64_i64_a_[ CHANNELS_i ][ PITCHES_i ];
+ static int const CHANNELS_i = 16;
+ static int const PITCHES_i = 128;
+ I64 running_i64_i64_a_[ CHANNELS_i ][ PITCHES_i ];
- Midi_score* midi_score_p_;
- int division_1_i_;
+ Midi_score* midi_score_p_;
+ int division_1_i_;
- char const* defined_ch_c_l_;
- int fatal_error_i_;
- My_midi_lexer* midi_lexer_p_;
+ char const* defined_ch_C_;
+ int fatal_error_i_;
+ My_midi_lexer* midi_lexer_p_;
};
extern My_midi_parser* midi_parser_l_g;
Lily_stream::Lily_stream( String filename_str )
{
- filename_str_ = filename_str;
- os_p_ = 0;
- indent_i_ = 0;
- comment_mode_bo_ = false;
- column_i_ = 0;
- wrap_column_i_ = 60;
- open();
- header();
+ filename_str_ = filename_str;
+ os_p_ = 0;
+ indent_i_ = 0;
+ comment_mode_bo_ = false;
+ column_i_ = 0;
+ wrap_column_i_ = 60;
+ open();
+ header();
}
Lily_stream::~Lily_stream()
{
- delete os_p_;
- if ( indent_i_ )
- warning( "lily indent level: " + String( indent_i_ ), 0 );
+ delete os_p_;
+ if ( indent_i_ )
+ warning( "lily indent level: " + String( indent_i_ ), 0 );
}
Lily_stream&
Lily_stream::operator <<( String str )
{
- static String nobreak_str = "\\`'_-.^<>*@";
- while ( str.length_i() ) {
- int max_i = wrap_column_i_ - column_i_ - 1;
- int i = str.length_i() - 1 <? max_i;
- int nl_i = str.left_str( i + 1 ).index_i( '\n' );
- if ( nl_i != -1 ) {
- i = nl_i - 1;
- str = str.nomid_str( nl_i, 1 );
- }
+ static String nobreak_str = "\\`'_-.^<>*@";
+ while ( str.length_i() ) {
+ int max_i = wrap_column_i_ - column_i_ - 1;
+ int i = str.length_i() - 1 <? max_i;
+ int nl_i = str.left_str( i + 1 ).index_i( '\n' );
+ if ( nl_i != -1 ) {
+ i = nl_i - 1;
+ str = str.nomid_str( nl_i, 1 );
+ }
- if ( ( i != str.length_i() - 1 ) && ( nl_i == -1 ) ) {
- while ( i && ( isalnum( str[ i ] )
- || ( nobreak_str.index_i( str[ i ] ) != -1 ) ) )
- i--;
+ if ( ( i != str.length_i() - 1 ) && ( nl_i == -1 ) ) {
+ while ( i && ( isalnum( str[ i ] )
+ || ( nobreak_str.index_i( str[ i ] ) != -1 ) ) )
+ i--;
- if ( !i ) { // no room left
- if ( column_i_ > 8 * indent_i_ ) {
- newline();
- if ( comment_mode_bo_ && ( str[ 0 ] != '%' ) )
- str = "%" + str;
- continue;
- }
- else { // cannot break neatly...
- i = max_i;
- }
- }
+ if ( !i ) { // no room left
+ if ( column_i_ > 8 * indent_i_ ) {
+ newline();
+ if ( comment_mode_bo_ && ( str[ 0 ] != '%' ) )
+ str = "%" + str;
+ continue;
}
-
- String line = str.left_str( i + 1 );
- str = str.mid_str( i + 1, INT_MAX );
- *os_p_ << line;
- column_i_ += line.length_i();
- if ( nl_i != -1 )
- newline();
- else
- check_comment( line );
- if ( ( str.length_i() && ( nl_i == -1 ) ) || ( column_i_ >= wrap_column_i_ ) ) {
- //brr.
- if ( comment_mode_bo_ )
- str = "%" + str;
- newline();
+ else { // cannot break neatly...
+ i = max_i;
}
- }
- return *this;
+ }
+ }
+
+ String line = str.left_str( i + 1 );
+ str = str.mid_str( i + 1, INT_MAX );
+ *os_p_ << line;
+ column_i_ += line.length_i();
+ if ( nl_i != -1 )
+ newline();
+ else
+ check_comment( line );
+ if ( ( str.length_i() && ( nl_i == -1 ) ) || ( column_i_ >= wrap_column_i_ ) ) {
+ //brr.
+ if ( comment_mode_bo_ )
+ str = "%" + str;
+ newline();
+ }
+ }
+ return *this;
}
Lily_stream&
Lily_stream::operator <<( Midi_event& midi_event_r )
{
- midi_event_r.output_mudela( *this, false );
- *os_p_ << flush;
- return *this;
+ midi_event_r.output_mudela( *this, false );
+ *os_p_ << flush;
+ return *this;
}
void
Lily_stream::check_comment( String str )
{
- int newline_i = str.index_last_i( '\n' );
- if ( newline_i != -1 ) {
- str = str.mid_str( newline_i +1, INT_MAX );
- comment_mode_bo_ = false;
- }
- if ( str.index_i( '%' ) != -1 )
- comment_mode_bo_ = true;
+ int newline_i = str.index_last_i( '\n' );
+ if ( newline_i != -1 ) {
+ str = str.mid_str( newline_i +1, INT_MAX );
+ comment_mode_bo_ = false;
+ }
+ if ( str.index_i( '%' ) != -1 )
+ comment_mode_bo_ = true;
}
void
Lily_stream::header()
{
- *os_p_ << "% Creator: " << mi2mu_version_str() << "\n";
- *os_p_ << "% Automatically generated, at ";
- time_t t( time( 0 ) );
- *os_p_ << ctime( &t );
- *os_p_ << "% from input file: ";
- *os_p_ << midi_parser_l_g->filename_str_;
- *os_p_ << "\n\n";
+ *os_p_ << "% Creator: " << mi2mu_version_str() << "\n";
+ *os_p_ << "% Automatically generated, at ";
+ time_t t( time( 0 ) );
+ *os_p_ << ctime( &t );
+ *os_p_ << "% from input file: ";
+ *os_p_ << midi_parser_l_g->filename_str_;
+ *os_p_ << "\n\n";
}
-
+/*
+ snapnie: dit kan toch automaties? Zie ook dstream.
+ */
void
Lily_stream::indent()
{
- indent_i_++;
- newline();
+ indent_i_++;
+ newline();
}
void
Lily_stream::newline()
{
- *os_p_ << endl << String( '\t', indent_i_ );
- column_i_ = indent_i_ * 8;
- comment_mode_bo_ = false;
+ *os_p_ << endl << String( '\t', indent_i_ );
+ column_i_ = indent_i_ * 8;
+ comment_mode_bo_ = false;
}
void
Lily_stream::open()
{
- os_p_ = new ofstream( filename_str_ );
- if ( !*os_p_ )
- error ( "can't open `" + filename_str_ + "\'", 0 );
+ os_p_ = new ofstream( filename_str_ );
+ if ( !*os_p_ )
+ error ( "can't open `" + filename_str_ + "\'", 0 );
}
void
Lily_stream::tnedni()
{
- assert( indent_i_ > 0 );
- indent_i_--;
- newline();
+ assert( indent_i_ > 0 );
+ indent_i_--;
+ newline();
}
#include "mi2mu.hh"
-Source source;
-Source* source_l_g = &source;
+Sources source;
+Sources* source_l_g = &source;
Verbose level_ver = NORMAL_ver;
//ugh
-char const* defined_ch_c_l = 0;
+char const* defined_ch_C = 0;
// ugh, another global
String
// ugh, copied from warn.cc, cannot use
void
-message( String message_str, char const* context_ch_c_l )
+message( String message_str, char const* context_ch_C )
{
String str = "mi2mu: ";
- Source_file* sourcefile_l = source_l_g->sourcefile_l( context_ch_c_l );
+ Source_file* sourcefile_l = source_l_g->sourcefile_l( context_ch_C );
if ( sourcefile_l ) {
- str += sourcefile_l->file_line_no_str(context_ch_c_l) + String(": ");
+ str += sourcefile_l->file_line_no_str(context_ch_C) + String(": ");
}
str += message_str;
if ( sourcefile_l ) {
str += ":\n";
- str += sourcefile_l->error_str( context_ch_c_l );
+ str += sourcefile_l->error_str( context_ch_C );
}
// if ( busy_parsing() )
cerr << endl; // until we have fine output manager...
}
void
-warning( String message_str, char const* context_ch_c_l )
+warning( String message_str, char const* context_ch_C )
{
- message( "warning: " + message_str, context_ch_c_l );
+ message( "warning: " + message_str, context_ch_C );
}
void
-error( String message_str, char const* context_ch_c_l )
+error( String message_str, char const* context_ch_C )
{
- message( message_str, context_ch_c_l );
+ message( message_str, context_ch_C );
// since when exits error again?
// i-d say: error: errorlevel |= 1; -> no output upon error
// warning: recovery -> output (possibly wrong)
" Han-Wen Nienhuys <hanwen@stack.nl>\n"
// "Contributors\n"
" Jan Nieuwenhuizen <jan@digicash.com>\n"
-// " Mats Bengtsson <matsb@s3.kth.se>\n"
"\n"
" This program is free software; you can redistribute it and/or\n"
"modify it under the terms of the GNU General Public License version 2\n"
0, "be-blonde", 'b',
0, "debug", 'd',
0, "help", 'h',
-// 1, "include", 'I',
0, "no-silly", 'n',
1, "output", 'o',
0, "quiet", 'q',
help();
exit( 0 );
break;
-// case 'I':
-// path->push( getopt_long.optarg );
-// break;
case 'n':
Duration_convert::no_double_dots_b_s = false;
Duration_convert::no_triplets_b_s = true;
char* arg_sz = 0;
while ( ( arg_sz = getopt_long.get_next_arg() ) ) {
- My_midi_parser midi_parser( arg_sz );
+ My_midi_parser midi_parser( arg_sz, & source );
+ midi_parser_l_g = &midi_parser;
+
int error_i = midi_parser.parse();
if ( error_i )
return error_i;
if ( !output_str.length_i() ) {
- output_str = String( arg_sz ) + ".ly";
- // i-m sure there-s already some routine for this
- int name_i; // too bad we can-t declare local to if
- if ( ( name_i = output_str.index_last_i( '/' ) ) != -1 )
- output_str = output_str.mid_str( name_i + 1, INT_MAX );
+ String d, dir, base, ext;
+
+ split_path(arg_sz, d, dir, base, ext);
+
+ output_str = base + ext + ".ly";
}
error_i = midi_parser.output_mudela( output_str );
if ( error_i )
return error_i;
+ midi_parser_l_g = 0;
}
return 0;
}
#include "version.hh"
-static char *s = "mi2mu " MAJOR_VERSION "." MINOR_VERSION "." MY_PATCH_LEVEL " #%d";
+static char *s = "mi2mu " MAJOR_VERSION "." MINOR_VERSION "." PATCH_LEVEL MY_PATCH_LEVEL " #%d";
static const int build=
#include ".build"
//ugh
String str;
- if ( dur_.plet_p_ )
+ if ( dur_.plet_b() )
str += String( "\\plet{ " )
- + String_convert::i2dec_str( dur_.plet_p_->iso_i_, 0, 0 )
+ + String_convert::i2dec_str( dur_.plet_.iso_i_, 0, 0 )
+ "/"
- + String_convert::i2dec_str( dur_.plet_p_->type_i_, 0, 0 )
+ + String_convert::i2dec_str( dur_.plet_.type_i_, 0, 0 )
+ " } ";
str += name_str_;
Duration dur = dur_;
- dur.set_plet( 0 );
+ dur.set_plet( 1,1 );
str += Duration_convert::dur2_str( dur );
- if ( dur_.plet_p_ )
+ if ( dur_.plet_b() )
str += String( " \\plet{ 1/1 }" );
return str;
{
(void)command_mode_bo;
if ( !text_str_.length_i()
- || ( text_str_.length_i() != (int)strlen( text_str_.ch_c_l() ) ) )
+ || ( text_str_.length_i() != (int)strlen( text_str_.ch_C() ) ) )
return "";
return "% " + text_str_ + "\n\t";
-%{
+%{//-*-Fundamental-*-
// midi-lexer.l
#include "mi2mu.hh"
#include "midi-parser.hh"
+#define YY_USER_ACTION char_count_ += YYLeng(); // ugh
%}
%option c++
%option noyywrap
%option nodefault
-%option yylineno
%option debug
%option yyclass="My_midi_lexer"
%option stack
<meta_event>{U8} {
warning( String( "meta_event: unimplemented event: " )
+ String_convert::bin2hex_str( String( *YYText() ) ),
- this->here_ch_c_l() );
+ this->here_ch_C() );
yy_pop_state();
yy_pop_state();
yy_push_state( u8 );
int
yylex()
{
- return midi_lexer_l_g->yylex();
+ return midi_lexer_l_g->yylex();
}
My_midi_lexer* midi_lexer_l_g = 0;
-My_midi_lexer::My_midi_lexer( String filename_str )
+My_midi_lexer::My_midi_lexer( String &filename_str, Sources * sources )
{
- midi_lexer_l_g = this;
- input_file_p_ = new Input_file( filename_str );
- switch_streams( input_file_p_->is );
- errorlevel_i_ = 0;
+ source_file_p_ =sources->get_file_l(filename_str);
+ switch_streams( source_file_p_->istream_l() );
+ errorlevel_i_ = 0;
+ char_count_ = 0;
}
My_midi_lexer::~My_midi_lexer()
{
- delete input_file_p_;
- midi_lexer_l_g = 0;
+ delete source_file_p_;
}
void
My_midi_lexer::error( char const* sz_l )
{
- if ( !input_file_p_ ) {
-// *mlog << "error at EOF" << sz_l << '\n';
+ if ( !source_file_p_ ) {
cerr << "error at EOF" << sz_l << '\n';
} else {
- char const* ch_c_l = here_ch_c_l();
- if ( ch_c_l ) {
- ch_c_l--;
- while ( ( *ch_c_l == ' ' ) || ( *ch_c_l == '\t' ) || ( *ch_c_l == '\n' ) )
- ch_c_l--;
- ch_c_l++;
+ char const* ch_C = here_ch_C();
+ if ( ch_C ) {
+ ch_C--;
+ while ( ( *ch_C == ' ' ) || ( *ch_C == '\t' ) || ( *ch_C == '\n' ) )
+ ch_C--;
+ ch_C++;
}
errorlevel_i_ |= 1;
-// ::error( sz_l, ch_c_l );
- ::error( sz_l, ch_c_l );
+ ::error( sz_l, ch_C );
}
}
char const*
-My_midi_lexer::here_ch_c_l()
+My_midi_lexer::here_ch_C()
{
- return input_file_p_->sourcefile_l_->ch_c_l() + yyin->tellg();
+ return source_file_p_->ch_C() + char_count_ ;
}
int
My_midi_lexer::varint2_i( String str )
{
- int var_i = 0;
+ int var_i = 0;
- for ( int i = 0; i < str.length_i(); i++ ) {
- Byte byte = str[ i ];
- var_i <<= 7;
- var_i += byte & 0x7f;
- if ( ! ( byte & 0x80 ) )
- return var_i;
- }
- cout << "\nvarint2_i:" << String_convert::bin2hex_str( str ) << endl;
- assert( 0 ); // illegal varint
- return 0;
+ for ( int i = 0; i < str.length_i(); i++ ) {
+ Byte byte = str[ i ];
+ var_i <<= 7;
+ var_i += byte & 0x7f;
+ if ( ! ( byte & 0x80 ) )
+ return var_i;
+ }
+ cout << "\nvarint2_i:" << String_convert::bin2hex_str( str ) << endl;
+ assert( 0 ); // illegal varint
+ return 0;
}
int
My_midi_lexer::close_i()
{
- return 0;
+ return 0;
}
My_midi_parser* midi_parser_l_g = 0;
-My_midi_parser::My_midi_parser( String filename_str )
+My_midi_parser::My_midi_parser( String filename_str, Sources *sources_l )
{
- midi_parser_l_g = this;
filename_str_ = filename_str;
- midi_lexer_p_ = new My_midi_lexer( filename_str_ );
- defined_ch_c_l_ = 0;
+ midi_lexer_p_ = new My_midi_lexer( filename_str_,sources_l );
+ midi_lexer_l_g = midi_lexer_p_; // ugh
+
+ defined_ch_C_ = 0;
fatal_error_i_ = 0;
midi_key_p_ = 0;
midi_score_p_ = 0;
My_midi_parser::~My_midi_parser()
{
+ midi_lexer_l_g = 0; // ugh
+
delete midi_lexer_p_;
- midi_parser_l_g = 0;
delete midi_key_p_;
delete midi_tempo_p_;
delete midi_time_p_;
IPL_instantiate(Midi_track);
PL_instantiate(Midi_voice);
IPL_instantiate(Midi_voice);
-IPL_instantiate(Source_file);
IPL_instantiate(Track_column);
mi2mu_version_str()
{
return String ( "This is " ) + mi2mu_version_sz()
- + flower_version_sz()
+ + "/" + flower_version_sz()
+ " of " + __DATE__ + " " + __TIME__;
}