--- /dev/null
+[From a posting in rec.music.classical.guitar]
+
+I started coding on Lilypond because I am fascinated by music and by
+typography. I have never used any egngraving software, and do not
+feel the need to investigate other programs, for the simple reason
+that I have no need of typesetting music. In fact, I almost never use
+Lilypond. I believe that the largest thing I ever entered was Bach's
+WTK-I fugue 2, two pages of piano music. I entered it about 1.5 years
+ago.
+
+I am fascinated by this complicated problem, typesetting music with a
+computer. And that is why I started writing Lilypond: purely for the
+hack value, for the fun of coding. To me, music notation is like a
+giant puzzle. I have been coding on Lilypond and studying music
+notation in my spare time for the past three years. Since this is my
+hobby, strictly spoken I have no obligations concerning Lily, neither
+moral, nor legal. Of course, I am open to pleas and requests and
+often do respond to them, but I have the choice to ignore them, and
+occasionally I do.
+
+Lilypond tries to typeset music *automatically*. We (*) try to put as
+much of our knowledge of music typography into the program as
+possible, and have as little typographical information in the input as
+possible. Basically, you ought to be able to produce nicely printed
+scores with Lilypond without knowing anything about engraving.
+
+ footnote (*): We = me and Jan Nieuwenhuizen, who wrote about
+ 30% of the code, and provided most of the examples.)
+
+A second important issue is that Lilypond is free. Not only in the
+sense that you can download Lilypond at no charge, but it is also free
+as in "free speech". User are free to modify the program to suit
+their needs, and redistribute or sell the program. Moreover, since
+the program can be downloaded at no cost, I don't gain anything if it
+gets more users. And here I mean "use" as opposed to "use and
+enhance" or "use and give helpful comments".
+
+We have not made a program for professionals, and as a result, hackers
+have begun to use it. Some of them have sent me modifications that
+improve the software. This is good for us, because it helps us solve
+our puzzle more quickly. We would have made the program useful for
+professionals like you, presumably they would start using it, be glad
+they didn't have to pay, and ignore me. That would not help me solve
+my puzzle; I don't gain anything.
+
+The system has reached a point that it is useful for quite a lot of
+people (we get about 200 downloads per month from the main FTP site),
+and a lot of my users have thanked me for rescuing them from tedious
+typesetting work using Finale, Encore and what-have-you-more. I have
+a user in Russia who tries make a living by typesetting a 260-page
+book on harmonic-theory using Lilypond. I have a user that can
+typeset his own 45 page orchestral score. Laymen have called our
+printout of the Bach Cello Suite 2 of "professional quality".
+
+This program is now useful to more people than a program solely aimed
+at professional use.
+
+Obviously, we're not finished yet, since the program still contains
+quite a lot bugs. We know the examples on the website contain lots of
+errors. Tweaking the input to fix up and hide the errors would cost
+us a lot of time. Time that is better spent improving the program
+itself. So, we don't hide the errors.
+
+Most of the errors that are shown on the website are not caused by our
+lack of knowledge, but rather by a lack of time and the sheer
+complexity of this big puzzle we're solving.
+
+In the end, we also want a system that is fully tweakable, so you can
+also produce professional quality typesetting. But being
+straightforward to use for non-professionals is more important now.
+
+Finally, I would like to stress that my goals while programming on
+LilyPond are separate from my beliefs of what should be done with the
+program. I can not control what the program is used for, nor do I want
+to. People can typeset lullabies for their baby daughters or racist
+warsongs to help fascist leaders.
+
+A fortiori, I can not control what copyright users place on their
+input and output. If you want to do commercial music editing (with
+LilyPond) you can publish scores on paper and keep the input and
+output to your self. You can publish the score online, and keep the
+input to yourself. You can put the input online as well, while
+forbidding modifications. You can publish the input and allow
+modifications.
+
+This is all up to the user of the software, not to me.
+
+
+Han-Wen Nienhuys,
+
+April 11, 1999
+
nsubsect(MEMBERS)
verb(
- Class::member()
+ Class::member ()
Type Class::member_type_
- Type Class::member_type()
+ Type Class::member_type ()
)
the code(type) is a Hungarian notation postfix for code(Type). See below
Don't laugh. It took us a whole evening/night to figure out one of
these bugs, because we had a macro that looked like
-code(DECLARE_VIRTUAL_FUNCTIONS()).
+code(DECLARE_VIRTUAL_FUNCTIONS ()).
nsubsect(BROKEN CODE)
Long class documentation.
(Hungarian postfix)
- TODO Fix boring_member()
+ TODO Fix boring_member ()
*/
class Class {
/**
/**
- short memo. long doco of member()
+ short memo. long doco of member ()
@param description of arguments
@return Rettype
*/
- Rettype member(Argtype);
+ Rettype member (Argtype);
/// memo only
- boring_member() {
+ boring_member () {
data_member_ = 121; // ugh
}
};
verb(
///check that *this satisfies its invariants, abort if not.
- void OK() const
+ void OK () const
/// print *this (and substructures) to debugging log
- void print() const
+ void print () const
/**
- protected member. Usually invoked by non-virtual XXXX()
+ protected member. Usually invoked by non-virtual XXXX ()
*/
- virtual do_XXXX()
+ virtual do_XXXX ()
/**add some data to *this.
Presence of these methods usually imply that it is not feasible to this
NAME = documentation
SUBDIRS=man tex pictures topdocs ntweb
STEPMAKE_TEMPLATES=documentation
-README_TOP_FILES=NEWS DEDICATION TODO ANNOUNCE-0.1
+README_TOP_FILES=NEWS DEDICATION TODO ANNOUNCE-0.1 AIMS
INFO_FILES = $(wildcard $(outdir)/$(package).info*)
EXTRA_DIST_FILES = gnu-music-history TODO
nsubsect(Why: Background Information)
itemize(
+it() url(Why?)(AIMS.html)
it() url(Design criteria)(MANIFESTO.html)
it()url(The GNU Music project)(gnu-music.html)
it()url(Mutopia -- Music To the People)(mutopia.html)
dit(lurl(http://www.ram.org/ramblings/philosophy/fmp.html))
Musings on free music, plus hints how to record your own (free) music.
-dit(lurl(http://www.cyberus.ca/~jdsankey/harpsichord.html))
+dit(lurl(http://www.geocities.com/Vienna/Studio/1714/))
John Sankey has taken up the task of recording classical
music, and distributing the results at no cost.
)
The Number One Free Operating System Kernel: Linux
dit(lurl( http://sound.condorow.net))
Dave Philips' Linux sound applications page
+dit(lurl(http://www4.smart.net/~jcovey/scores.html))
+ Jeff Covey's guitar music=
dit(lurl(http://www.home.fh-karlsruhe.de/~rost0001/web/musik/musik.html))
Stochastic composing using LilyPond
dit(lurl(http://www.medieval.org/emfaq/scores/software.html))
OUTDOC_FILES = $(addprefix $(outdir)/, $(DOC_FILES))
EL_FILES = $(wildcard *.el)
BIB_FILES= $(wildcard *.bib)
-EXTRA_DIST_FILES= $(BIB_FILES) $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(YO_URG_FILES) $(TEX_FILES) $(wildcard *.sty)
+EXTRA_DIST_FILES= $(BIB_FILES) $(DOC_FILES) $(DATA_FILES) $(EL_FILES) $(YO_URG_FILES) $(TEX_FILES) $(wildcard *.sty) testje.fly
HTML_FILES = $(addprefix $(outdir)/, $(YO_FILES:.yo=.html))
PS_FILES = $(DVI_FILES:.dvi=.ps)
dvi: $(OUT_BIB_FILES) $(DVI_FILES)
-
ps: $(PS_FILES)
# urg
--- /dev/null
+% -*-LaTeX-*-
+\documentclass{article}
+
+\begin{document}
+\title{LilyPond feature test}
+\author{Han-Wen Nienhuys}
+\maketitle
+
+This document tries give an brief overview of LilyPond features. When
+the text correspond with the shown notation, we consider LilyPond
+Officially BugFree (tm).
+
+\section{Notes and rests}
+
+Rests. Note that the dot of 8th, 16th and 32nd rests rest should be
+next to the top of the rest. All rests except the whole rest are
+centered on the middle staff line.
+
+\mudelafile{rest.fly}
+
+Note head shapes are settable. The stem endings should be adjusted
+per note head
+
+\mudelafile{noteheadstyle.fly}
+
+
+\section{Beams, slurs and other spanners}
+
+%Beams should not interfere with various items on the staff (amongst
+%others repeat signs)
+%
+% \mud elafile{beam-repeat.ly}
+
+Beams can be typeset over fixed distance aligned staffs, beam
+beautification doesn't really work, but knees do. Beams should be
+behave well, whereever the switching point is.
+
+\mudelafile{beam-interstaff.ly}
+
+The same goes for slurs. They behave decently when broken across
+linebreak.
+
+\mudelafile{slur-interstaff.ly}
+
+Tuplets are indicated by a bracket with a number. There should be no
+bracket if there is one beam that matches the length of the tuplet.
+The bracket does not interfere with the stafflines, and the number is
+centered in the gap in the bracket.
+
+\mudelafile{tup.ly}
+
+\section{Multiple notes}
+
+Rests should not collide with beams, stems and noteheads. Rests may
+be under beams. Rests should be move by integral number of spaces
+inside the staff, and by half spaces outside. Notice that the half
+and whole rests just outside the staff get ledger lines in different
+cases.
+
+
+\mudelafile{rest-collision.ly}
+
+Normal collisions. We have limited support for four voice polyphony,
+where the middle voices are horizontally shifted, sometimes.
+
+\mudelafile{collisions.ly}
+
+The number of stafflines of a staff can be set with the property
+numberOfStaffLines. Ledger lines both on note heads and rests are adjusted.
+
+\mudelafile{number-staff-lines.fly}
+
+\section{Global stuff}
+
+Markings that are attached to (invisible) barlines are quite
+delicate: the are attached to the rest of the score without the score
+knowing it. Consequently, they fall over quite often.
+
+\mudelafile{bar-scripts.ly}
+
+
+\end{document}
be no empty lines between the normal text and the mudela
environment.
+You can also use \verb|mudelafile| (on a separate line, FIXME), to
+include another file.
+
+\mudelafile{testje.fly}
+
\section{Fontsize options}
You can use all lilypond fontsizes in mudela-book.
% LONG line just to test multiple \mudela on one line
a feature of \LaTeX. (But you usually put things inside a verbatim
environment when you don't want \LaTeX~to do any linebreaking)
-\end{document}
-\begin{verbatim}
-\end{verbatim}
+
+\end{document}
--- /dev/null
+
+c''4^"This! Is! A! Test!" d e
---- ../lilypond-1.1.38/NEWS Tue Apr 6 10:26:06 1999
-++ b/NEWS Thu Apr 8 18:12:05 1999
-@@ -1,3 +1,8 @@
+pl 39
+ - \property textstyle -> textStyle
+
pl 38.tca1
- added scm/accordion-script.scm and update ly/accordion-defs.ly
- renamed some accordion symbols to make them more english and less
norwenglish.
- removed dot from \accBayanbase
- pl 37.script2
- - bf: AFM for BlueSky AFM files.
- - \penalty = 4278 -> \penalty 4278pl 38.uu1
+
+pl 37.script4
+ - bf: molecule
+ - bf: tuplet spanner appearance.
+ - bf: less spacing after clef. Invisible bar has no dims.
+ - included AIMS. The why of Lily.
+ - warning if duplicate engraver.
+ - warning if no ties could be created.
+ - bf: \time1/4; .. beams ..
+ - bf: staff switching beams / slurs.
+ - tuplets on multiple beams.
+ - Documentation/tex/lilypond-regtest.doc
+ - bf: nested tuplets
+ - slur cleanups.
+ - bf: multi_measure_rest_engraver in Score_context.
+
+pl 38.uu1
- bf: clef_8
- bf: barnumbers.
+pl 37.script3
+ - fixes for spring_spacer, introduced
+Spacing_engraver
+ - cleanup for rest-collisions.
+ - hacks for GUILE gc
+ - mudela-book \mudelafile
+ - Documentation/tex/lilypond-regtest.doc
+ - MF rest fixes
+
+
********
pl 38 (april 6)
pl 37.script2
-
pl 17
- fixed RPM building.
. * We need feta-din*.mf files for more sizes than 10.
. * latex bla.tex broken (titles / \lilyfooter stuff?
. * fix dynamics decently, ie. use kerning & ligatures.
+. * dots & rest collisions?
+. * mudela-book.py
+. * \mudelafile{} to have decent functionality
+. * use less RE's
. * support_l_arr_ empty in staff-margin's G_staff_side_item
. * slurs colllide with lyrics.
. * minVerticalAlign for StaffGroups.
specify the third. Should there be?
. * spacing of mmrests.
. * mem leak: redo p-score object deletion.
+. * rest collision minimum dist.
+. * Matanya's tips:
+. * spacing for prefatory matter
+. * accidentals closer to note head
+. * ledger line for rest dim less
+. * heavier beams?
+
.* Cleanups needed
. * Beam
. * --prefix option?
. * -I option per filetype?
. * kpathsea?
-
. * ly2dvi/lilypond logfile.
-. * How can I specify a chord whose duration is longer than a whole note?
- \type ChordNames { \chord{ A1*2-min } }
-
-gives me a parse error. And \times doesn't work either. I can't use
-a spacer note. So it seems to be impossible to have long chords of
-general length. Of course, in the example above I can use \breve.
-But what if I want a chord that lasts for 3 whole notes? Or what
-about 2.5 whole notes? Is there a mechanism for getting this kind of
-length?
-
. * fractional chord durs.
. * hang Item on Spanner
. * do --safe for PS output?
.* SMALLISH PROJECTS
+. * Faulenzer sign (% repeat)
+
. * fix confusing naming in Engraver vs Engraver_group_engraver (context)
. * progress when creating MIDI elts.
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=1
-PATCH_LEVEL=38
-MY_PATCH_LEVEL=tca1
+PATCH_LEVEL=39
+MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
list.write ('</ul>')
list.write('<h2>Contents of this directory</h2>\n');
- list.write (
- 'These example files are taken from the LilyPond distribution. '
- 'LilyPond currently only outputs TeX and MIDI. The pictures and '
- 'PostScript files were generated using TeX, Ghostscript and some '
- 'graphics tools. The papersize used for these examples is A4. '
- 'As you know, <a href="http://www.gnu.org/philosophy/gif.html">no gifs due to patent problems</a>, '
- 'but the png images should be viewable with any current browser '
- '(jpeg is inappropriate for music images).'
- '\n');
+ list.write ("""
+These example files are taken from the LilyPond distribution.
+LilyPond currently only outputs TeX and MIDI. The pictures and
+PostScript files were generated using TeX, Ghostscript and some
+graphics tools. The papersize used for these examples is A4.
+As you know, <a href="http://www.gnu.org/philosophy/gif.html">no gifs due to patent problems</a>,
+but the PNG images should be viewable with any current browser
+<p>
+If you want an accurate impression of the output quality please <em>print
+out</em> the samples first.
+ """);
for ex in inputs:
-configure --prefix=~ --enable-profiling --enable-config=optprof --enable-optimise --disable-checking
+configure --prefix=$HOME/usr --enable-profiling --enable-config=optprof --enable-optimise --disable-checking --enable-debugging
#
# (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
+#TODO. This could be more efficient.
+
name = 'ps-to-pfa'
-version = '0.2'
+version = '0.3'
-outdir = 'out/'
datadir = ''
import os
import getopt
from string import *
-import regex
import regsub
+
+# todo, port: see http://starship.skyport.net/crew/amk/regex/regex-to-re.html
+import re
import time
def program_id ():
+ "Options:\n"
+ " -d, --datadir=DIR use DIR for ps header/footer\n"
+ " -h, --help print this help\n"
+ + " -o, --output=FILE set output file to FILE.\n"
% (program_name)
)
sys.exit (0)
+output_name = ''
+
identify ()
(options, files) = getopt.getopt (
- sys.argv[1:], 'd:', ['help', 'package'])
+ sys.argv[1:], 'o:d:', ['help', 'package', 'output='])
for opt in options:
o = opt[0]
a = opt[1]
help ()
elif o == '-d' or o == '--datadir':
datadir = a
+ elif o == '-o' or o =='--output':
+ output_name = a
else:
print o
raise getopt.error
return s
mf = files[0]
-# urg ?
-font = os.path.basename (os.path.splitext (mf)[0])
-sys.stderr.write ('Font: %s\n'% font)
+
+input_name = mf
+font_name = os.path.basename (os.path.splitext (mf)[0])
+if not output_name:
+ output_name = font_name + '.pfa'
+
+
+sys.stderr.write ('Font: %s\n'% font_name)
def header (f):
- f.write ('%!PS-AdobeFont-3.0: ' + font + '\n')
+ f.write ('%!PS-AdobeFont-3.0: ' + font_name + '\n')
f.write ('%%%%Creator: %s-%s\n' % (name, version))
f.write ('\n')
f.write ('/setgray { 1 add } bind def\n'
'%%/FontBBox [-30 -30 30 30] def\n'
'\n'
'/Encoding 256 array def %% Trivial encoding vector\n'
-'0 1 255 {Encoding exch /.notdef put} for\n' % (font))
+'0 1 255 {Encoding exch /.notdef put} for\n' % (font_name))
def footer (f):
f.write ('\n'
'currentdict\n'
'end % of font dictionary\n')
f.write ('\n')
- f.write ('/%s\n' % font)
+ f.write ('/%s\n' % font_name)
f.write (''
'exch definefont pop % Define the font\n')
# chars = os.listdir ()
# chars.sort ()
sys.stderr.write ('[')
- pipe = os.popen ('/bin/ls -1 ' + font + '.[0-9] ' + font + '.[0-9][0-9] ' + font + '.[0-9][0-9][0-9] 2> /dev/null')
+ pipe = os.popen ('/bin/ls -1 ' + font_name + '.[0-9] ' + font_name + '.[0-9][0-9] ' + font_name + '.[0-9][0-9][0-9] 2> /dev/null')
chars = []
i = pipe.readline ()
while i:
s = regsub.gsub ('^showpage\n', '', s)
s = regsub.gsub ('^', ' ', s)
n = atoi (regsub.gsub ('.*\.', '', i))
- s = '\n /%s-%d{\n%s} bind def\n' % (font, n, s)
- encoding = encoding + 'Encoding %d /%s-%d put\n' % (n, font, n)
+ s = '\n /%s-%d{\n%s} bind def\n' % (font_name, n, s)
+ encoding = encoding + 'Encoding %d /%s-%d put\n' % (n, font_name, n)
charprocs = charprocs + s
f.write (charprocs)
f.write ('\n')
f.write ('\n')
sys.stderr.write (']')
-ps = outdir + font + '.pfa'
-ps_file = open (ps, 'w')
+
+ps_file = open (output_name, 'w')
header (ps_file)
characters (ps_file)
footer (ps_file)
sys.stderr.write ('\n')
ps_file.close ()
-sys.stderr.write ('Wrote PostScript font: %s\n'% ps)
+sys.stderr.write ('Wrote PostScript font: %s\n'% output_name)
#ifndef CONS_HH
#define CONS_HH
-#include <assert.h>
-#define TAIL
template<class T>
class Cons
{
public:
- T * car_p_;
- Cons * next_cons_p_;
+ T * car_;
+ Cons * next_;
Cons ()
{
- car_p_=0;
- next_cons_p_ =0;
+ car_=0;
+ next_ =0;
}
Cons (T*t, Cons<T>*c)
{
- car_p_ = t;
- next_cons_p_ = c;
+ car_ = t;
+ next_ = c;
}
virtual ~Cons ()
{
- delete next_cons_p_;
+ delete next_;
}
};
/// remove the link pointed to by *p.
template<class T>
-Cons<T> *remove_cons_p (Cons<T> **pp)
+Cons<T> *remove_cons (Cons<T> **pp)
{
Cons<T> *knip = *pp;
- *pp = (*pp)->next_cons_p_;
- knip->next_cons_p_ = 0;
+ *pp = (*pp)->next_;
+ knip->next_ = 0;
return knip;
}
-
-template<class T> int cons_list_size_i (Cons<T> *l)
-{
- int i=0;
- while (l)
- {
- l = l->next_cons_p_;
- i++;
- }
- return i;
-}
-
/**
Invariants:
- (*loose_cons_p_p_) is either the head_cons_p_ pointer, or a next_cons_p_ pointer from the list.
+ (*tail_) is either the head_ pointer, or a next_ pointer from the list.
- **loose_cons_p_p_ == NULL
+ **tail_ == NULL
*/
template<class T>
class Cons_list
{
-#ifdef TAIL
-private:
- // find tail helper; is this handy?
- Cons<T> * tail_cons_l_;
-#endif
-
public:
- // make these private?
- Cons<T> * head_cons_p_;
- Cons<T> ** loose_cons_p_p_;
-
-
- Cons_list ()
- {
- init ();
- }
- void init ()
- {
- head_cons_p_ = 0;
- loose_cons_p_p_ = &head_cons_p_;
-#ifdef TAIL
- tail_cons_l_ = 0;
-#endif
- }
+ Cons<T> * head_;
+ Cons<T> ** tail_;
+ Cons_list () { init_list (); }
+ void init_list () {head_ =0; tail_ = &head_; }
void append (Cons<T> *c)
{
- assert (!c->next_cons_p_);
-#ifndef TAIL
- *loose_cons_p_p_ = c;
- while (*loose_cons_p_p_)
- loose_cons_p_p_ = &(*loose_cons_p_p_)->next_cons_p_;
-#else
- *loose_cons_p_p_ = c;
- tail_cons_l_ = *loose_cons_p_p_;
- while (tail_cons_l_->next_cons_p_)
- tail_cons_l_ = tail_cons_l_->next_cons_p_;
- loose_cons_p_p_ = &tail_cons_l_->next_cons_p_;
-#endif
- }
- Cons<T>* tail_cons_l ()
- {
- assert (!empty_b ());
-#ifndef TAIL
- Cons<T>* tail_cons_l = head_cons_p_;
- while (tail_cons_l->next_cons_p_)
- tail_cons_l = tail_cons_l->next_cons_p_;
- return tail_cons_l;
-#else
- return tail_cons_l_;
-#endif
+ assert (!c->next_);
+ *tail_ = c;
+ while (*tail_)
+ tail_ = &(*tail_)->next_;
}
/**
- PRE: *pp should either be the head_cons_p_ pointer,
- or the next_cons_p_ pointer from a list cell.
+ PRE: *pp should either be the head_ pointer, or the next_ pointer
+ from a list cell.
*/
- Cons<T> *remove_cons_p (Cons<T> **pp)
+ Cons<T> *remove_cons (Cons<T> **pp)
{
-#ifndef TAIL
- if (&(*pp)->next_cons_p_ == loose_cons_p_p_)
- loose_cons_p_p_ = pp;
-#else
- if (*pp == tail_cons_l_)
- {
- //either here
- tail_cons_l_ = tail_cons_l ();
- loose_cons_p_p_ = pp;
- }
-#endif
-
- return ::remove_cons_p (pp);
- }
- bool empty_b ()
- {
- return !head_cons_p_;
- }
- int size_i ()
- {
- return cons_list_size_i (head_cons_p_);
- }
- T* head_car_l ()
- {
- assert (!empty_b ());
- return head_cons_p_->car_p_;
- }
- T* car_l ()
- {
- assert (!empty_b ());
- return head_cons_p_->car_p_;
- }
- T* tail_car_l ()
- {
- assert (!empty_b ());
- // or here?
-#ifndef TAIL
- return tail_cons_l ()->car_p_;
-#else
- return tail_cons_l_->car_p_;
-#endif
+ if (&(*pp)->next_ == tail_)
+ tail_ = pp;
+
+ return ::remove_cons (pp);
}
void junk ()
{
- delete head_cons_p_;
- init ();
- }
- ~Cons_list ()
- {
- junk ();
+ delete head_;
+ head_ =0;
}
+ ~Cons_list () { junk (); }
};
void
clone_killing_cons_list (Cons_list<T>&, Cons<T> *src);
+template<class T> int cons_list_size_i (Cons<T> *l)
+{
+ int i=0;
+ while (l)
+ {
+ l = l->next_;
+ i++;
+ }
+ return i;
+}
+
+
+
#endif /* CONS_HH */
static T infinity() ;
static String T_to_str (T arg);
-
- /*
- ugh, egcs 1.02 ices on this
- */
T center() { return (elem (LEFT) + elem (RIGHT)) / T(2);}
void translate (T t)
{
elem (RIGHT) += t;
}
- /*
- junk us
- */
- T &max() { return elem (RIGHT);}
- T max() const { return elem (RIGHT);}
- T min() const{ return elem (LEFT); }
- T &min(){ return elem (LEFT); }
/**
PRE
*this and h are comparable
/**
- inclusion ordering. Crash if not comparable.
+ inclusion ordering. Crash if not comparable.
*/
template<class T>
int Interval__compare (const Interval_t<T>&,Interval_t<T> const&);
+/**
+ Inclusion ordering. return -2 if not comparable
+ */
+template<class T>
+int
+_Interval__compare (const Interval_t<T>&a,Interval_t<T> const&b);
+
+
/*
INLINE
*/
template<class T>
Killing_cons<T>::~Killing_cons ()
{
- delete car_p_;
+ delete car_;
}
template<class T>
void
copy_killing_cons_list (Cons_list<T> &dest, Cons<T> *src)
{
- for (; src; src = src->next_cons_p_)
+ for (; src; src = src->next_)
{
- T *t = new T(*src->car_p_);
+ T *t = new T(*src->car_);
dest.append ( new Killing_cons<T> (t, 0));
}
}
void
clone_killing_cons_list (Cons_list<T> & dest, Cons<T> *src)
{
- for (; src; src = src->next_cons_p_)
+ for (; src; src = src->next_)
{
- T *t = src->car_p_->clone ();
+ T *t = src->car_->clone ();
dest.append (new Killing_cons<T> (t, 0));
}
}
{
Scalar (Real r) { *this = to_str (r); }
Scalar (int i) { *this = to_str (i); }
+ Scalar (long l) { *this = to_str (l); }
Scalar (char c) { *this = to_str (c); }
Scalar (char const *c) : String (c) {}
Scalar (String s) : String (s) {}
/** The functor String_convert handles all conversions to/from String
(some time, anyway). The class is quite empty from data view. */
class String_convert {
- static int hex2bin_i (String hex_str, String& bin_str_r);
- static int hex2nibble_i (Byte byte);
- static Byte nibble2hex_byte (Byte byte);
+ static int hex2bin_i (String hex_str, String& bin_str_r);
+ static int hex2nibble_i (Byte byte);
+ static Byte nibble2hex_byte (Byte byte);
public:
- static String bool_str (bool b);
- static String bin2dec_str (String bin_str);
- static String bin2hex_str (String bin_str);
- static String dec2bin_str (String str);
- static int bin2_i (String bin_str);
- static unsigned bin2_u (String bin_str);
- static String char_str (char c, int n);
- static int dec2_i (String dec_str);
- static double dec2_f (String dec_str);
- static String double_str (double f, char const* fmt=0);
- static String form_str (char const* format, ...);
- static String vform_str (char const* format, va_list args);
- static int hex2_i (String str);
- static unsigned hex2_u (String str);
- static String hex2bin_str (String str);
- static String int_str (int i, char const *fmt=0 );
- static String i2hex_str (int i, int length_i, char ch);
- static String u2hex_str (unsigned u, int length_i, char ch);
- static String i2dec_str (int i, int length_i, char ch);
- static String rational_str (Rational);
- static String pointer_str (void const *);
- static String precision_str (double x, int n);
- static Array<String> split_arr (String str, char c);
- static String i64_str (I64, char const * fmt = 0);
+ static String bool_str (bool b);
+ static String bin2dec_str (String bin_str);
+ static String bin2hex_str (String bin_str);
+ static String dec2bin_str (String str);
+ static int bin2_i (String bin_str);
+ static unsigned bin2_u (String bin_str);
+ static String char_str (char c, int n);
+ static int dec2_i (String dec_str);
+ static double dec2_f (String dec_str);
+ static String double_str (double f, char const* fmt=0);
+ static String form_str (char const* format, ...);
+ static String vform_str (char const* format, va_list args);
+ static int hex2_i (String str);
+ static unsigned hex2_u (String str);
+ static String hex2bin_str (String str);
+ static String int_str (int i, char const *fmt=0 );
+ static String long_str (long);
+ static String i2hex_str (int i, int length_i, char ch);
+ static String u2hex_str (unsigned u, int length_i, char ch);
+ static String i2dec_str (int i, int length_i, char ch);
+ static String rational_str (Rational);
+ static String pointer_str (void const *);
+ static String precision_str (double x, int n);
+ static Array<String> split_arr (String str, char c);
+ static String i64_str (I64, char const * fmt = 0);
};
#endif // __STRING_CONVERT_HH //
String to_str (char c, int n = 1);
String to_str (int i, char const* format = 0);
String to_str (double f , char const* format = 0);
+String to_str (long b);
String to_str (bool b);
String to_str (char const* format, ... );
return a;
}
+
+String
+String_convert::long_str (long l)
+{
+ char s[STRING_BUFFER_LEN];
+ sprintf (s,"%ld", l);
+ return s;
+}
{
return String_convert::bool_str (b);
}
+String
+to_str (long b)
+{
+ return String_convert::long_str (b);
+}
String
to_str (char const* format, ... )
+++ /dev/null
-\score{
- \notes \relative c''{
- \time 2/4;
- c8
- \repeat 2 { % \bar "|:" iknoort-i ook...
- c8 c8
- }
- c8
- }
- \paper{
- \translator{
- \VoiceContext
- % add experimental auto-beaming
- \consists Auto_beam_engraver;
- beamAuto = 1.;
- beamAutoEnd_8 = "1/4";
- beamAutoEnd_16 = "1/4";
- beamAutoEnd_32 = "1/4";
- }
- }
-}
+++ /dev/null
-\score{
- \notes \type Voice {
- \times 2/3 {[c16 c16 c16]}
- }
-}
-
+++ /dev/null
-\score{
- \type GrandStaff <
- \type Staff=one \notes\relative c'{
- s1
- }
- \type Staff=two \notes\relative c'{
- \clef bass;
- s2
- \translator Staff=one \stemup [c8 c c c ]
- % the translator switch below, intended for the next beam,
- % affects (and breaks) the beam above
- \translator Staff=two
- }
- >
- \paper{
- % no slur damping
- slur_slope_damping = 10.0;
- \translator{
- \GrandStaffContext
- minVerticalAlign = 3.0*\staffheight;
- maxVerticalAlign = 3.0*\staffheight;
- }
- linewidth=-1.;
- }
-}
+++ /dev/null
-basloopje = \notes\relative c{
- [d,8 a' d f] [a\translator Staff=treble d f d] \translator Staff=bass
-}
-
-
-
-lower = \type Voice=two \notes \relative c{
- < \basloopje >
-}
-\score {
- \type PianoStaff <
-\notes \type Staff = treble { c1 }
-
- \type Staff = bass <
- \clef bass;
- \lower
- >
- >
-
- \paper {
- gourlay_maxmeasures = 4.;
- indent = 8.\mm;
- textheight = 295.\mm;
-
- % no slur damping
- slur_slope_damping = 100.0;
- }
- \midi {
- \tempo 4 = 54;
- }
-}
-
+++ /dev/null
-%
-% This file prints lots of warning messages about scripts-dportato
-%
-
-\header{
-filename = "scales.ly";
-enteredby = "HWN";
-copyright = "public domain";
-}
-
-%{
- Tested Features: scripts, beams, transposition,
-%}
-
-%
-% scales with accents.
-%
-
-\version "1.0.14";
-blah = \notes {
- \time 6/8;
-\transpose c {
- \clef "bass";
- c4. d
-}
- c d
- \clef "violin" ;
-\transpose c'' {
- \transpose d { e f } }
-\transpose c''' {
- c4. d
- %ugr
- |\times 6/9 { a8 \< a a a a a a \! a a \ff \> ] } | }
- \transpose c'' {
- \times 6/9 { a a a a a a a a \! a ] } | }
- \transpose c''' {
- \times 6/9 { c,->-.-\fermata \< g,->-.-\fermata
- d->-.-\fermata a->-.-\fermata
- e'->-.-\fermata b'-. f''-. c'''->-.-\fermata
- \! g'''->-.-\fermata \> ] }
-
- \times 6/9 { g'''->-.-\fermata c'''->-.-\fermata
- f''->-.-\fermata b'->-.-\fermata e'->-.-\fermata
- a->-.-\fermata d->-.-\fermata g,->-.-\fermata \!
- c,->-.-\fermata ] }
-
- \times 6/9 { c,->-.-\fermata \< g,->-.-\fermata d->-.-\fermata
- a->-.-\fermata
- e'->-.-\fermata b'-. f''-.
- c'''->-.-\fermata \! g'''->-.-\fermata \> ] }
- \times 6/9 { g'''->-.-\fermata c'''->-.-\fermata
- f''->-.-\fermata b'->-.-\fermata e'->-.-\fermata
- a->-.-\fermata d->-.-\fermata
- g,->-.-\fermata \! c,->-.-\fermata ] }
- }
- \transpose c'' {
- \times 2/3 { c g d' ] }
- \times 2/3 { d' g c ] }
- \times 2/3 { f c' g' ] }
- \times 2/3 { g' c' f ] }
- }
- \transpose c' {
- \times 2/3 { c g d' ] }
- \times 2/3 { d' g c ] }
- \times 2/3 { f c' g' ] }
- \times 2/3 { g' c' f ] }
- \times 2/3 { g' c' f ] }
- \time 4/4;
-
-c1}
-
- r8-"text" r8^. r8_. r8 r8 r8 r8 r8
- [c-> d-> e-> f->][g-> a-> b-> c'->] % 1
-\transpose c'' { [c'-^ b-^ a-^ g-^][f-^ e-^ d-^ c-^]}
- [c'-^ b-^ a-^ g-^][f-^ e-^ d-^ c-^]
- [c-. d-. e-. f-.][g-. a-. b-. c'-.]
- [c'-- b-- a-- g][f-- e-- d c--] % 5
- [c-\portato d-\portato e-\portato f-\portato]
- [g-\portato a-\portato b-\portato c'-\portato]
- [c'-\upbow b-\upbow a-\downbow g-\downbow]
- [f-\downbow e-\downbow d-\upbow c-\upbow]
- [c-| d-| e-| f-|][g-| a-| b-| c'-|]
- [c' b a g][f e d c]
- [c d e f][g a b c'] % 10
- |[c' b a g][f e d c]
-
- }
-
-
-\score{
- \notes {\blah}
- \paper{
- castingalgorithm = \Wordwrap;
- }
-}
+++ /dev/null
-a'' <c ~ e g> c
+++ /dev/null
-
-corI=\notes\relative c'' {
-\key c;
-
-[g8. \f ( a16 ] ) g2 |
-[g8. ( a16 ] ) g2_"dim." |
-c2. \p ( |
-) g2 g4 ( |
-) c2. ( |
-) g4 [g8. ( a16 ] ) g4 |
-c2. \p ( |
-) g2 g4 |
-c2 \< ( ~ [ \! c8 \> \! ) g ] |
-g2 \p r4 |
-g \mf ( d' c~ |
-c ) b r |
-R2. |
-}
-
-corII=\notes\relative c'' {
-\key c;
-\time 3/4;
-
-R2.*19 |
-r4 r [g8^"solo" \p (\< \! ) e'] |
-g2 \> ( [e8. ) \! c16 ] | % grace note e8 () g2
-g2 r 4 |
-r r \times 2/3 {[e'8 \p ( g, ) g' ]} |
-g4 \> () \! e r |
-r r \times 2/3 {[g8 \p ( e ) g ]} |
-d4 \> () \! g r |
-r r [g,16 ( \p d' e d ] |
-) g,4 r r |
-R2. |
-r4 r c \p ( |
-) g r r |
-g [g8. ( a16 ] ) g4 |
-R2. |
-r4 r [g8^""^"solo" \mf \< () \! e' ] |
-g2 \> [ \! e8. ( c16 ] |
-) g2 r4 |
-R2. |
-r4 r \times 2/3 {[e'8 \f ( g, ) g'] } |
-g4 () e r |
-r r \times 2/3 {[g8 \f ( e ) g] }
-d4 () g r |
-r r [d16 \f ( g, e' d ] |
-[g, d' e ) d ] g,4 r |
-r d'2 \f \> ( | % grace note g8 d2
-[g,8. a16 g8. a16 \! g8. ) a16 ] |
-g4 r r |
-}
-
-trpI=\notes\relative c'' {
-\key c;
-\time 3/4;
-
-R2.*30 |
-}
-
-\score{ <
- \type StaffGroup = brass <
- \type Staff = cor <
- \type Voice = corI { \stemup \corI }
- \type Voice = corII { \stemdown \corII }
- >
- \type Staff = trp <
- \type Voice = trpI { \stemup \trpI }
- >
- >
->
- \paper {
- \translator {\OrchestralScoreContext
- % The following line causes a SIGSEGV
- \consists "Multi_measure_rest_engraver";
- }
- }
-}
+++ /dev/null
-%{
- wierd grouping bug
-%}
-
-\score{
- \notes \relative c''{
- % be sure it's not related to auto-beamer
- \property Voice.beamAuto = "0"
- \time 1/2;
- [ c8 c c c ]
- \time 1/4;
- [ c8 c ]
- }
- \paper{
- }
-}
% 13
\type Staff <
- \type VoiceOne { \stemup r4 dis' cis cis ~ |
+ \type VoiceTwo { r4 }
+ \type VoiceOne { \stemup s4 dis' cis cis ~ |
[cis8 a d cis] [bis gis] cis4 |
dis2 cis4 r8 cis }
\type VoiceOne { \stemup bis2 }
%15
\type Staff <
- { \stemup [b8 fis8] b4 }
- { \stemdown fis2 }
+ \type Voice = VA { \stemup [b8 fis8] b4 }
+ \type Voice = VB { \stemdown fis2 }
>
%{ this chord is usually set like this:
|
\accepts VoiceThree;
\accepts VoiceTwo;
\accepts VoiceOne;
- }
+ }
+% \translator { \OrchestralScoreContext }
}
\midi {
\type GrandStaff <
\type Staff=one \notes\relative c'{
\stemup [c8 c \translator Staff=two \stemup c c]
- r2
+ [c c c c]
\translator Staff=one
\stemdown [c8 c \translator Staff=two \stemup c c]
r2
--- /dev/null
+\score{
+ \notes \relative c''{
+ \time 2/4;
+ c8
+ \repeat 2 { % \bar "|:" iknoort-i ook...
+ c8 c8
+ }
+ c8
+ }
+}
\type Voice=iii { \stemdown c4 d e d c d es }
>
-
-rests = \type Staff \notes <
- \type Voice=i { \stemup | r8 r r r r r r r [c' b a g] [f e d c] }
- \type Voice = ii { \stemdown [c8 d e f] [g a b c'] r r r r r r r r }
->
-
-restsII = \type Staff \notes {
- \type Voice=i
- <
- { \stemup g' f' e' d' c' b a g f e d c }
- \type Voice = ii { \stemdown r r r r r r r r r r r r }
- >
- <
- { \stemup r r r r r r r r r r r r }
- \type Voice = ii { \stemdown c d e f g a b c' d' e' f' g' }
- >
- r8 r4
- < r8 r8 >
- < r8 r8 r8 >
- < r8 r8 r8 r8 >
- < r r >
- < r r r >
- \stemup
- [c''8 r8 c''8 c''8]
- [c8 r8 c8 c8]
- \stemdown
- [c8 r8 c8 c8]
- [c''8 r8 c''8 c''8]
-}
-
\score{
\notes \transpose c'' { \twovoice
\twovoicesteminvert
\threevoice
- \rests
- % UGH ! bug!
- \restsII
+
}
--- /dev/null
+
+scale = \notes \relative c' {
+ c8 d e f g a b c c d e f g a b c
+
+}
+rests = \notes {
+ r r r r r r r r r r r r r r r r
+}
+
+scales = \type Staff \notes <
+ \type Voice=i { \stemup r1 r2 r2 \scale c''1 c'2 a'2 \rests }
+ \type Voice = ii { \stemdown a'1 a'2 d'2 \rests r1 r2 r2 \scale }
+>
+
+restsII = \type Staff \notes {
+ r4 r8
+ \type Staff < { \stemup r8 } { \stemdown r8} >
+ \type Staff < {\stemup r8} r8 { \stemdown r8} >
+ \type Staff < {\stemup r8} r8 r8 { \stemdown r8} >
+ \type Staff < {\stemup r} { \stemdown r} >
+ \type Staff < {\stemup r} r { \stemdown r} >
+ \stemup
+ \transpose c'' { [c''8 r8 c''8 c''8]
+ [c8 r8 c8 c8]
+ \stemdown
+ [c8 r8 c8 c8]
+ [c''8 r8 c''8 c''8] }
+}
+
+\score{
+ \notes {
+ \scales
+ \restsII
+ }
+}
--- /dev/null
+\time 4/4;
+r \longa * 1/4 r\breve * 1/2
+r1 r2 r4 r8 r16 r32 r64 r128 r128
+\time 6/4;
+r1. r2. r4. r8. r16. r32. r64. r128. r128.
\score{
\type GrandStaff <
\type Staff=one \notes\relative c'{
- \stemup c4( c \translator Staff=two c )c
+ \stemup c4( c \translator Staff=two c )c |
\translator Staff=one
- \stemup c4( c \translator Staff=two c )c
- \stemup c4( c \translator Staff=one c )c
+ \stemup c4( c \translator Staff=two c )c |
+ \stemup c4( c \translator Staff=one c )c |
\translator Staff=two
- \stemup c4( c \translator Staff=one c )c
+ \stemup c4( c \translator Staff=one c )c |
\translator Staff=two
- \stemup c4( \translator Staff=one c c )c
+ \stemup c4( \translator Staff=one c c )c |
r2
\translator Staff=two
- \stemup c4( \translator Staff=one c \break c )c
+ \stemup c4( \translator Staff=one c
+ \break
+ c )c
r2
% \stemdown c4( \translator Staff=two c c \translator Staff=one )c
\stemdown d4( \translator Staff=two c c \translator Staff=one )d
\score{
- \notes \type Voice \times 2/3 { \times 2/3 { a8 b c} c }
+ \notes \type Voice {
+ \times 2/3 { \times 2/3 { a8 b c} c }
+ \times 3/4 { c4 c4 c4 c4 }
+ \time 6/8;
+ \times 6/9 { c8 c c c c c c c c }
+
+ }
}
Slice line = line_slice (pos_ch_C);
char const* data_ch_C = ch_C ();
- return String ((Byte const*)data_ch_C + line.min (), line.length ());
+ return String ((Byte const*)data_ch_C + line[LEFT], line.length ());
}
int
return 0;
char const* data_ch_C = ch_C ();
- return pos_ch_C - (line_slice (pos_ch_C).min () + data_ch_C);
+ return pos_ch_C - (line_slice (pos_ch_C)[SMALLER] + data_ch_C);
}
int
Sources::sourcefile_l (char const* ch_C)
{
- for (Cons<Source_file> *i = sourcefile_p_list_; i; i = i->next_cons_p_)
- if (i->car_p_->in_b (ch_C))
- return i->car_p_;
+ for (Cons<Source_file> *i = sourcefile_p_list_; i; i = i->next_)
+ if (i->car_->in_b (ch_C))
+ return i->car_;
return 0;
}
}
Real interbeam_f = paper_l ()->interbeam_f (mult);
- Real w = 1.5 * lookup_l ()->notehead (2, "").dim_.x ().length ();
+ Real w = 1.5 * lookup_l ()->notehead (2, "").dim_[X_AXIS].length ();
Real space = stem_l_->staff_line_leading_f ();
Real internote_f = space/2;
if (bar_breaks[i][1] == type_str_)
{
type_str_ = bar_breaks[i][break_status_dir ()+1];
- if (remove_elt_property (at_line_start_scm_sym)!= SCM_BOOL_F
- && (break_status_dir () == RIGHT) && (type_str_ == ""))
- {
- type_str_ = "|";
- }
+ break;
}
}
+ if (remove_elt_property (at_line_start_scm_sym)!= SCM_BOOL_F
+ && (break_status_dir () == RIGHT) && (type_str_ == ""))
+ {
+ type_str_ = "|";
+ }
+
+ if (type_str_ =="")
+ dim_cache_[X_AXIS].set_empty (true);
}
#endif
stems_.push (s);
s->add_dependency (this);
+
+ assert (!s->beam_l_);
s->beam_l_ = this;
if (!spanned_drul_[LEFT])
mol_p->translate_axis (x0
- spanned_drul_[LEFT]->absolute_coordinate (X_AXIS), X_AXIS);
- // correct if last note (and therefore reference point of beam)
- // is on different staff
- Stem_info si = sinfo_.top ();
- mol_p->translate_axis (-si.interstaff_f_ * si.stem_l_->staff_line_leading_f ()/2,
- Y_AXIS);
-
return mol_p;
}
Beam::do_pre_processing ()
{
if (!dir_)
- set_default_dir ();
+ dir_ = get_default_dir ();
+
+
+ set_direction (dir_);
}
void
stems_.top ()->hpos_f ());
}
-void
-Beam::set_default_dir ()
+Direction
+Beam::get_default_dir () const
{
Drul_array<int> total;
total[UP] = total[DOWN] = 0;
Drul_array<int> count;
count[UP] = count[DOWN] = 0;
Direction d = DOWN;
-
+
+ Direction beamdir;
for (int i=0; i <stems_.size (); i++)
do {
Stem *s = stems_[i];
switch (a)
{
case MAJORITY:
- dir_ = (count[UP] > count[DOWN]) ? UP : DOWN;
+ beamdir = (count[UP] > count[DOWN]) ? UP : DOWN;
break;
case MEAN:
// mean centre distance
- dir_ = (total[UP] > total[DOWN]) ? UP : DOWN;
+ beamdir = (total[UP] > total[DOWN]) ? UP : DOWN;
break;
default:
case MEDIAN:
// median centre distance
if (!count[UP])
- dir_ = DOWN;
+ beamdir = DOWN;
else if (!count[DOWN])
- dir_ = UP;
+ beamdir = UP;
else
- dir_ = (total[UP] / count[UP] > total[DOWN] / count[DOWN]) ? UP : DOWN;
+ beamdir = (total[UP] / count[UP] > total[DOWN] / count[DOWN]) ? UP : DOWN;
break;
}
+ return beamdir;
+}
+void
+Beam::set_direction (Direction d)
+{
+ dir_ = d;
for (int i=0; i <stems_.size (); i++)
{
Stem *s = stems_[i];
- s->set_elt_property (beam_dir_scm_sym, gh_int2scm (dir_));
+ s->set_elt_property (beam_dir_scm_sym, gh_int2scm (d));
SCM force = s->remove_elt_property (dir_forced_scm_sym);
if (force == SCM_BOOL_F)
- s->dir_ = dir_;
+ s->dir_ = d;
}
}
l.minimise (slope_f_, left_y_);
}
+/*
+ ugh. Naming: this doesn't check, but sets as well.
+ */
+
Real
Beam::check_stemlengths_f (bool set_b)
{
Interval iv = quantise_iv (allowed_fraction, interline_f, dy_f);
- quanty_f = (dy_f - iv.min () <= iv.max () - dy_f)
- ? iv.min ()
- : iv.max ();
+ quanty_f = (dy_f - iv[SMALLER] <= iv[BIGGER] - dy_f)
+ ? iv[SMALLER]
+ : iv[BIGGER];
slope_f_ = (quanty_f / dx_f) / internote_f * sign (slope_f_);
Interval iv = quantise_iv (allowed_position, space, dy_f);
- Real quanty_f = dy_f - iv.min () <= iv.max () - dy_f ? iv.min () : iv.max ();
+ Real quanty_f = dy_f - iv[SMALLER] <= iv[BIGGER] - dy_f ? iv[SMALLER] : iv[BIGGER];
if (extend_b)
- quanty_f = iv.max ();
+ quanty_f = iv[BIGGER];
// dim(left_y_) = internote
left_y_ = dir_ * quanty_f / internote_f;
// enge floots
Real epsilon_f = staffline_f / 8;
- DOUT << "Beam::set_stemlens: \n";
Real dy_f = check_stemlengths_f (false);
for (int i = 0; i < 2; i++)
{
dy_f = check_stemlengths_f (true);
if (abs (dy_f) <= epsilon_f)
{
- DOUT << "Beam::set_stemlens: " << i << " iterations\n";
break;
}
}
int j = 0;
for (int i = 1; i < size (); i++)
{
- if ((*this)[i].y () > 0)
+ if ((*this)[i][Y_AXIS] > 0)
{
- Real phi = (*this)[i].y () / (*this)[i].x ();
+ Real phi = (*this)[i][Y_AXIS] / (*this)[i][X_AXIS];
if (phi > alpha)
{
alpha = phi;
// bounds func should be templatised to take array of offsets too?
Array<Real> positions;
for (int i = 0; i < curve_.size (); i++)
- positions.push (curve_[i].x ());
+ positions.push (curve_[i][X_AXIS]);
Slice slice = get_bounds_slice (positions, x);
// ugh
- Offset z1 = curve_[0 >? slice.max () - 1];
- Offset z2 = curve_[1 >? slice.max ()];
- Real multiplier = (x - z2.x ()) / (z1.x () - z2.x ());
- Real y = z1.y () * multiplier + (1.0 - multiplier) * z2.y();
+ Offset z1 = curve_[0 >? slice[BIGGER] - 1];
+ Offset z2 = curve_[1 >? slice[BIGGER]];
+ Real multiplier = (x - z2[X_AXIS]) / (z1[X_AXIS] - z2[X_AXIS]);
+ Real y = z1[Y_AXIS] * multiplier + (1.0 - multiplier) * z2[Y_AXIS];
return y;
}
// be careful not to take too big step
Real f = 0.3;
Real h1 = dy1 * f;
- control_[1].y () += h1;
- control_[2].y () += h1;
- return_[1].y () += h1;
- return_[2].y () += h1;
+ control_[1][Y_AXIS] += h1;
+ control_[2][Y_AXIS] += h1;
+ return_[1][Y_AXIS] += h1;
+ return_[2][Y_AXIS] += h1;
calc_bezier ();
Real dy2 = check_fit_f ();
if (sign (h) != sign (h1))
return;
- control_[1].y () += -h1 +h;
- control_[2].y () += -h1 +h;
- return_[1].y () += -h1 +h;
- return_[2].y () += -h1 +h;
+ control_[1][Y_AXIS] += -h1 +h;
+ control_[2][Y_AXIS] += -h1 +h;
+ return_[1][Y_AXIS] += -h1 +h;
+ return_[2][Y_AXIS] += -h1 +h;
}
void
Bezier_bow::calc_bezier ()
{
- Real s = sqrt (control_[3].x () * control_[3].x ()
- + control_[1].y () * control_[2].y ());
+ Real s = sqrt (control_[3][X_AXIS] * control_[3][X_AXIS]
+ + control_[1][Y_AXIS] * control_[2][Y_AXIS]);
#ifndef STANDALONE
Real internote = paper_l_->get_realvar (interline_scm_sym)/2.0;
#else
Real clip_angle = 100;
#endif
- Real b = control_[3].x () - control_[0].x ();
+ Real b = control_[3][X_AXIS] - control_[0][X_AXIS];
Real clip_h = clip_ratio * b <? clip_height;
- Real begin_h = control_[1].y () - control_[0].y ();
- Real end_h = control_[2].y () - control_[3].y ();
+ Real begin_h = control_[1][Y_AXIS] - control_[0][Y_AXIS];
+ Real end_h = control_[2][Y_AXIS] - control_[3][Y_AXIS];
Real begin_dy = 0 >? begin_h - clip_h;
Real end_dy = 0 >? end_h - clip_h;
{
Real dy = (begin_dy + end_dy) / 4;
dy *= cos (alpha_);
- encompass_[0].y () += dir_ * dy;
- encompass_[encompass_.size () - 1].y () += dir_ * dy;
+ encompass_[0][Y_AXIS] += dir_ * dy;
+ encompass_[encompass_.size () - 1][Y_AXIS] += dir_ * dy;
}
else
{
if (end_alpha >= max_alpha)
end_dy = 0 >? c * end_alpha / max_alpha * end_h;
- encompass_[0].y () += dir_ * begin_dy;
- encompass_[encompass_.size () - 1].y () += dir_ * end_dy;
+ encompass_[0][Y_AXIS] += dir_ * begin_dy;
+ encompass_[encompass_.size () - 1][Y_AXIS] += dir_ * end_dy;
Offset delta = encompass_[encompass_.size () - 1] - encompass_[0];
alpha_ = delta.arg ();
void
Bezier_bow::calc_tangent_controls ()
{
- Offset ijk_p (control_[3].x () / 2, control_[1].y ());
- BEZIER_BOW_DOUT << "ijk: " << ijk_p.x () << ", " << ijk_p.y () << endl;
+ Offset ijk_p (control_[3][X_AXIS] / 2, control_[1][Y_AXIS]);
+ BEZIER_BOW_DOUT << "ijk: " << ijk_p[X_AXIS] << ", " << ijk_p[Y_AXIS] << endl;
- Real default_rc = ijk_p.y () / ijk_p.x ();
+ Real default_rc = ijk_p[Y_AXIS] / ijk_p[X_AXIS];
int begin_disturb = encompass_.largest_disturbing ();
- Offset begin_p = begin_disturb ? Offset (encompass_[begin_disturb].x (),
- encompass_[begin_disturb].y ()) : ijk_p;
- Real begin_rc = begin_p.y () / begin_p.x ();
+ Offset begin_p = begin_disturb ? Offset (encompass_[begin_disturb][X_AXIS],
+ encompass_[begin_disturb][Y_AXIS]) : ijk_p;
+ Real begin_rc = begin_p[Y_AXIS] / begin_p[X_AXIS];
if (default_rc > begin_rc)
{
begin_p = ijk_p;
Curve reversed;
reversed.set_size (encompass_.size ());
- Real b = control_[3].x ();
+ Real b = control_[3][X_AXIS];
for (int i = 0; i < encompass_.size (); i++ )
{
// b 1 0
// r = - * c
// 0 0 -1
- reversed[i].x () = b - encompass_[encompass_.size () - i - 1].x ();
- reversed[i].y () = encompass_[encompass_.size () - i - 1].y ();
+ reversed[i][X_AXIS] = b - encompass_[encompass_.size () - i - 1][X_AXIS];
+ reversed[i][Y_AXIS] = encompass_[encompass_.size () - i - 1][Y_AXIS];
}
int end_disturb = reversed.largest_disturbing ();
end_disturb = end_disturb ? encompass_.size () - end_disturb - 1 : 0;
- Offset end_p = end_disturb ? Offset (encompass_[end_disturb].x (),
- encompass_[end_disturb].y ()) : ijk_p;
- Real end_rc = end_p.y () / (control_[3].x () - end_p.x ());
+ Offset end_p = end_disturb ? Offset (encompass_[end_disturb][X_AXIS],
+ encompass_[end_disturb][Y_AXIS]) : ijk_p;
+ Real end_rc = end_p[Y_AXIS] / (control_[3][X_AXIS] - end_p[X_AXIS]);
if (default_rc > end_rc)
{
end_p = ijk_p;
end_rc = default_rc;
}
- BEZIER_BOW_DOUT << "begin " << begin_p.x () << ", " << begin_p.y () << endl;
- BEZIER_BOW_DOUT << "end " << end_p.x () << ", " << end_p.y () << endl;
+ BEZIER_BOW_DOUT << "begin " << begin_p[X_AXIS] << ", " << begin_p[Y_AXIS] << endl;
+ BEZIER_BOW_DOUT << "end " << end_p[X_AXIS] << ", " << end_p[Y_AXIS] << endl;
- Real height =control_[1].y ();
+ Real height =control_[1][Y_AXIS];
for (int i = 0; i < encompass_.size (); i++ )
- height = height >? encompass_[i].y ();
+ height = height >? encompass_[i][Y_AXIS];
// emperic computer science:
// * tangents somewhat steeper than minimal line
Real epsilon = internote / 5;
// if we have two disturbing points, have height line through those...
- if (!((abs (begin_p.x () - end_p.x ()) < epsilon)
- && (abs (begin_p.y () - end_p.y ()) < epsilon)))
- theta = atan (end_p.y () - begin_p.y ()) / (end_p.x () - begin_p.x ());
+ if (!((abs (begin_p[X_AXIS] - end_p[X_AXIS]) < epsilon)
+ && (abs (begin_p[Y_AXIS] - end_p[Y_AXIS]) < epsilon)))
+ theta = atan (end_p[Y_AXIS] - begin_p[Y_AXIS]) / (end_p[X_AXIS] - begin_p[X_AXIS]);
Real rc3 = tan (theta);
// ugh: be less steep
rc3 /= 2*rc_correct;
- Real c2 = -rc2 * control_[3].x ();
- Real c3 = begin_p.y () > end_p.y () ? begin_p.y ()
- - rc3 * begin_p.x () : end_p.y () - rc3 * end_p.x ();
+ Real c2 = -rc2 * control_[3][X_AXIS];
+ Real c3 = begin_p[Y_AXIS] > end_p[Y_AXIS] ? begin_p[Y_AXIS]
+ - rc3 * begin_p[X_AXIS] : end_p[Y_AXIS] - rc3 * end_p[X_AXIS];
BEZIER_BOW_DOUT << "y1 = " << rc1 << " x + 0" << endl;
BEZIER_BOW_DOUT << "y2 = " << rc2 << " x + " << c2 << endl;
BEZIER_BOW_DOUT << "y3 = " << rc3 << " x + " << c3 << endl;
- control_[1].x () = c3 / (rc1 - rc3);
- control_[1].y () = rc1 * control_[1].x ();
- control_[2].x () = (c3 - c2) / (rc2 - rc3);
- BEZIER_BOW_DOUT << "c2.x () = " << control_[2].x () << endl;
+ control_[1][X_AXIS] = c3 / (rc1 - rc3);
+ control_[1][Y_AXIS] = rc1 * control_[1][X_AXIS];
+ control_[2][X_AXIS] = (c3 - c2) / (rc2 - rc3);
+ BEZIER_BOW_DOUT << "c2[X_AXIS] = " << control_[2][X_AXIS] << endl;
BEZIER_BOW_DOUT << "(c3 - c2) = " << (c3 - c2) << endl;
BEZIER_BOW_DOUT << "(rc2 - rc3) = " << (rc2 - rc3) << endl;
- control_[2].y () = rc2 * control_[2].x () + c2;
- BEZIER_BOW_DOUT << "c2.y ()" << control_[2].y () << endl;
+ control_[2][Y_AXIS] = rc2 * control_[2][X_AXIS] + c2;
+ BEZIER_BOW_DOUT << "c2[Y_AXIS]" << control_[2][Y_AXIS] << endl;
calc_return (begin_alpha, end_alpha);
}
Bezier_bow::check_fit_bo ()
{
for (int i = 1; i < encompass_.size () - 1; i++)
- if ((encompass_[i].x () > encompass_[0].x ())
- && (encompass_[i].x () < encompass_[encompass_.size () -1].x ()))
- if (encompass_[i].y () > y (encompass_[i].x ()))
+ if ((encompass_[i][X_AXIS] > encompass_[0][X_AXIS])
+ && (encompass_[i][X_AXIS] < encompass_[encompass_.size () -1][X_AXIS]))
+ if (encompass_[i][Y_AXIS] > y (encompass_[i][X_AXIS]))
return false;
return true;
}
{
Real dy = 0;
for (int i = 1; i < encompass_.size () - 1; i++)
- if ((encompass_[i].x () > encompass_[0].x ())
- && (encompass_[i].x () < encompass_[encompass_.size () -1].x ()))
- dy = dy >? (encompass_[i].y () - y (encompass_[i].x ()));
+ if ((encompass_[i][X_AXIS] > encompass_[0][X_AXIS])
+ && (encompass_[i][X_AXIS] < encompass_[encompass_.size () -1][X_AXIS]))
+ dy = dy >? (encompass_[i][Y_AXIS] - y (encompass_[i][X_AXIS]));
return dy;
}
Real alpha = height_limit * 2.0 / pi;
Real beta = pi * ratio / (2.0 * height_limit);
- Offset delta (encompass_[encompass_.size () - 1].x ()
- - encompass_[0].x (), 0);
+ Offset delta (encompass_[encompass_.size () - 1][X_AXIS]
+ - encompass_[0][X_AXIS], 0);
Real b = delta.length ();
Real indent = alpha * atan (beta * b);
Real height = indent + h;
item_p->text_str_ = chord.banter_str (inversion);
- Scalar style = get_property ("textstyle", 0);
+ Scalar style = get_property ("textStyle", 0);
if (style.length_i ())
item_p->style_str_ = style;
return;
}
}
- int d = 1;
+ Direction d = UP;
do
{
if (!clash_group_arr_a[idx (d, false)].size())
clash_group_arr_a[idx (d, true)].clear();
}
}
- while ((d *= -1) != 1);
+ while (flip (&d) != UP);
Interval_t<int> y_extent[4];
{
x_off[idx (d, true)] = d*0.5;
}
- while ((d *= -1) != 1);
+ while (flip (&d) != UP);
// y_extent: smallest y-pos noteball interval containing all balls
// 4 (0..3) groups: stem up/down; shift on/off;
- Interval_t<int> middle (y_extent[idx (-1,0)].max(),
- y_extent[idx (1,0)].min());
- Interval_t<int> open_middle (y_extent[idx (-1,0)].max()+1, y_extent[idx (1,0)].min ()-1);
+ Interval_t<int> middle (y_extent[idx (-1,0)][BIGGER],
+ y_extent[idx (1,0)][SMALLER]);
+ Interval_t<int> open_middle (y_extent[idx (-1,0)][BIGGER]+1, y_extent[idx (1,0)][SMALLER]-1);
do
{
if (!open_middle.contains_b (y_extent[idx (d,true)]))
if (!middle.empty_b()
- && middle.length() < 2 && col_l_a[idx (1,0)] && col_l_a[idx (-1,0)]) {
- // reproduction of bugfix at 3am ?
- Note_head * nu_l= col_l_a[idx (1,0)]->head_l_arr_[0];
- Note_head * nd_l = col_l_a[idx (-1,0)]->head_l_arr_.top();
- if (! (nu_l->balltype_i_ == nd_l->balltype_i_
- && nu_l->dots_i_ == nd_l->dots_i_ && middle.length() == 0))
- {
- x_off[idx (1,0)] -= 0.5;
- x_off[idx (1,1)] -= 0.5;
- x_off[idx (-1,1)] += 0.5;
- x_off[idx (-1,0)] += 0.5;
- }
-
- }
+ && middle.length() < 2 && col_l_a[idx (1,0)] && col_l_a[idx (-1,0)])
+ {
+ // reproduction of bugfix at 3am ?
+ Note_head * nu_l= col_l_a[idx (1,0)]->head_l_arr_[0];
+ Note_head * nd_l = col_l_a[idx (-1,0)]->head_l_arr_.top();
+ if (! (nu_l->balltype_i_ == nd_l->balltype_i_
+ && nu_l->dots_i_ == nd_l->dots_i_ && middle.length() == 0))
+ {
+ do
+ {
+ x_off[idx (d, false)] -= d*0.5;
+ x_off[idx (d, true)] -= d*0.5;
+ }
+ while (flip (&d) != UP);
+ }
+ }
Real wid_f = paper_l ()->note_width ();
for (int j=0; j < 4; j++)
+++ /dev/null
-/*
- compressed-music-iterator.cc -- implement Compressed_music_iterator
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#include "compressed-music-iterator.hh"
-#include "compressed-music.hh"
-#include "musical-request.hh"
-#include "translator-group.hh"
-#include "command-request.hh"
-
-
-
-void
-Compressed_music_iterator::do_process_and_next (Moment m)
-{
- if (first_b_)
- {
- bool success = report_to_l ()->try_music (dynamic_cast<Compressed_music const*> (music_l_));
- if (!success)
- music_l_->warning ( _("No one to print a tuplet start bracket"));
- }
-
- Music_wrapper_iterator::do_process_and_next (m);
-}
+++ /dev/null
-/*
- compressed-music.cc -- implement Compressed_music
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#include "compressed-music.hh"
-
-
-Compressed_music::Compressed_music (int n, int d,Music *mp)
- : Music_wrapper (mp)
-{
- num_i_ = n;
- den_i_ = d;
- element_l ()->compress (Moment (num_i_,den_i_));
-}
-
-
-
-
#include "directional-spanner.hh"
-void
-Directional_spanner::set_default_dir()
+Direction
+Directional_spanner::get_default_dir() const
{
- dir_ = DOWN;
+ return DOWN;
}
void
Directional_spanner::do_pre_processing()
{
if (!dir_)
- set_default_dir();
+ dir_ = get_default_dir();
}
Directional_spanner::Directional_spanner()
Stem* stem_l = note->stem_l_;
+ if (!stem_l)
+ {
+ warning ("Slur over rest?");
+ o_[X_AXIS] = note->hpos_f ();
+ return;
+ }
+
Real internote = stem_l-> staff_line_leading_f ()/2.;
/*
- set o_.x () to middle of notehead or on the exact position of stem,
+ set o_[X_AXIS] to middle of notehead or on the exact position of stem,
according to slur direction
*/
- o_.x () = stem_l->hpos_f ();
+ o_[X_AXIS] = stem_l->hpos_f ();
/*
stem_l->dir == dir
*/
if (stem_l->dir_ != dir)
- o_.x () -= 0.5 * notewidth * stem_l->dir_;
+ o_[X_AXIS] -= 0.5 * notewidth * stem_l->dir_;
- o_.y () = stem_l->extent (Y_AXIS)[dir];
+ o_[Y_AXIS] = stem_l->extent (Y_AXIS)[dir];
/*
leave a gap: slur mustn't touch head/stem
*/
- o_.y () += 2.5 * internote * dir;
+ o_[Y_AXIS] += 2.5 * internote * dir;
if (stem_l->dir_ != dir)
- o_.y () += 1.0 * internote * dir;
+ o_[Y_AXIS] += 1.0 * internote * dir;
- Dimension_cache *common = note->common_group (slur_l, Y_AXIS);
+ Dimension_cache *common = stem_l->common_group (slur_l, Y_AXIS);
Align_element * align = dynamic_cast<Align_element*> (common->element_l ());
if (align && align->axis() == Y_AXIS)
{
/*
our staff is lower -> interstaff_f_ *= -1
*/
- // ? Is this OK?
+
if (slur_prio < stem_prio)
interstaff_f_ *= -1;
- o_.y () += interstaff_f_;
+ o_[Y_AXIS] += interstaff_f_;
}
}
void
Font_size_engraver::acknowledge_element (Score_element_info e)
{
- e.elem_l_->set_elt_property (fontsize_scm_sym,
- gh_int2scm (size_i_));
+ if (size_i_)
+ e.elem_l_->set_elt_property (fontsize_scm_sym,
+ gh_int2scm (size_i_));
}
ADD_THIS_TRANSLATOR (Font_size_engraver);
continue;
Line_of_cols line = all.slice (breaks[start_idx], breaks[break_idx]+1);
-
- line[0] = line[0]->postbreak_l ();
- line.top () = line.top ()->prebreak_l ();
+
+ line[0] = dynamic_cast<Paper_column*>(line[0]->find_prebroken_piece (RIGHT));
+ line.top () = dynamic_cast<Paper_column*>(line.top ()->find_prebroken_piece (LEFT));
if (!feasible (line))
break;
Array<Stem*>* stem_l_arr_p_;
Moment last_add_mom_;
Moment extend_mom_;
+
+ // We act as if beam were created, and start a grouping anyway.
Rhythmic_grouping*grouping_p_;
Rhythmic_grouping*finished_grouping_p_;
};
Link_array<Stem> stems_;
/// the slope of the beam in posns / point (dimension)
Real slope_f_;
- /// the slope as solved; not quantised or damped
- Real solved_slope_f_;
/// position of leftmost end of beam
Real left_y_;
protected:
virtual Interval do_width () const;
Offset center () const;
- void set_default_dir ();
+ Direction get_default_dir () const;
+ void set_direction (Direction);
void set_steminfo ();
+
virtual void do_pre_processing ();
virtual void do_post_processing ();
virtual void do_substitute_element_pointer (Score_element*, Score_element*);
+++ /dev/null
-/*
- compressed-music-iterator.hh -- declare Compressed_music_iterator
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#ifndef COMPRESSED_MUSIC_ITERATOR_HH
-#define COMPRESSED_MUSIC_ITERATOR_HH
-
-#include "music-wrapper-iterator.hh"
-
-class Compressed_music_iterator : public Music_wrapper_iterator
-{
-public:
- // construction
-protected:
- virtual void do_process_and_next (Moment);
-};
-
-
-#endif /* COMPRESSED_MUSIC_ITERATOR_HH */
-
+++ /dev/null
-/*
- compressed-music.hh -- declare Compressed_music
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#ifndef COMPRESSED_MUSIC_HH
-#define COMPRESSED_MUSIC_HH
-
-#include "music-wrapper.hh"
-/**
- Tempo expansion or compression.
- */
-class Compressed_music : public Music_wrapper
-{
-public:
- int num_i_;
- int den_i_;
-
- Compressed_music (int, int, Music *);
-
- VIRTUAL_COPY_CONS(Music);
-};
-
-#endif /* COMPRESSED_MUSIC_HH */
-
/// offset of "center" relative to left-column/0-pos of staff
virtual Offset center() const;
- virtual void set_default_dir();
+ virtual Direction get_default_dir() const;
protected:
virtual void do_pre_processing();
};
Encompass_info (Note_column const*, Direction, Slur const *);
Offset o_;
+ // junkme
Real interstaff_f_;
};
void init_symbols ();
#include "ly-symbols.hh"
+/*
+ DIY gc protection.
+ */
+SCM ly_protect_scm (SCM s);
+SCM ly_unprotect_scm (SCM s);
+void init_ly_protection ();
+
+
#endif // LILY_GUILE_HH
struct Command_script_req;
struct Command_tie_engraver;
struct Command_tie_req;
-struct Compressed_music;
-struct Compressed_music_iterator;
+struct Time_scaled_music;
+struct Time_scaled_music_iterator;
struct Cresc_req;
struct Crescendo ;
struct Decresc_req;
#include "box.hh"
#include "axes.hh"
#include "direction.hh"
-#include "protected-scm.hh"
#include "cons.hh"
//#define ATOM_SMOB
/** a group of individually translated symbols. You can add molecules
- to the top, to the right, etc. */
+ to the top, to the right, etc.
+
+ Dimension behavior:
+
+ Empty molecules have empty dimensions. If add_at_edge is used to
+ init the molecule, we assume that
+ DIMENSIONS = (Interval(0,0),Interval(0,0)
+
+*/
class Molecule {
#ifdef ATOM_SMOB
SCM atom_list_;
Cons<Atom> *atom_list_;
#endif
friend class Paper_outputter;
+
public:
Box dim_;
Molecule();
~Molecule();
- void add_at_edge (Axis a, Direction d, const Molecule &m, Real padding);
+ /**
+ Set dimensions to empty, or to (Interval(0,0),Interval(0,0) */
+ void set_empty (bool);
+ void add_at_edge (Axis a, Direction d, const Molecule &m, Real padding);
+ void add_atom (Atom const *a);
void add_molecule (Molecule const &m);
void translate (Offset);
- void do_center (Axis);
+
+ /**
+ align D direction in axis A.
+
+ If D == CENTER, then move the dimension(A).center() to (0,0)
+
+ Else, move so dimension(A)[D] == 0.0
+
+ */
+ void align_to (Axis a, Direction d);
void translate_axis (Real,Axis);
+
- void add_atom (Atom const *a);
/// how big is #this#?
Box extent() const;
Interval extent (Axis) const;
virtual Moment length_mom () const;
virtual ~Music_wrapper ();
virtual Musical_pitch to_relative_octave (Musical_pitch);
-
+ virtual void compress (Moment);
};
(chord) and scripts) as a single entity. */
class Note_column : public Axis_group_item {
protected:
-
+ virtual void do_post_processing () ;
virtual void do_print () const;
virtual void do_substitute_element_pointer (Score_element*,Score_element*);
public:
/** The relative position of the "voice" containing this
chord. Normally this would be the same as the stem direction,
- but rests do not have stems.
- JUNKME.v
+ JUNKME.
*/
Direction dir () const;
Stem* stem_l_;
Link_array<Note_head> head_l_arr_;
Link_array<Rest> rest_l_arr_;
-
+
Interval_t<int> head_positions_interval() const;
// Interval width () const;
void preprocess ();
/// set a minimum distance
void add_rod (Paper_column * to, Real distance);
-
- /** prebreak is put before end of line.
- if broken here, then (*this) column is discarded, and prebreak
- is put at end of line, owned by Col
- */
- Paper_column *prebreak_l() const;
-
- /// postbreak at beginning of the new line
- Paper_column *postbreak_l() const;
virtual Paper_column * column_l () const;
/// if lines are broken then this column is in #line#
Paper_column();
- /**
- which col comes first?.
- signed compare on columns.
-
- @return < 0 if c1 < c2.
- */
- static int compare (const Paper_column &c1, const Paper_column &c2);
void set_rank (int);
void OK() const;
};
-#include "compare.hh"
-INSTANTIATE_COMPARE(Paper_column &, Paper_column::compare);
+// #include "compare.hh"
+// INSTANTIATE_COMPARE(Paper_column &, Paper_column::compare);
#endif // P_COL_HH
Protected_scm (SCM);
Protected_scm (Protected_scm const &);
~Protected_scm ();
- Protected_scm &operator = (Protected_scm const &);
+ Protected_scm &operator = (SCM);
+ Protected_scm &operator =( Protected_scm const&);
operator SCM () const;
SCM to_SCM () const;
};
Rest_collision();
protected:
- virtual void do_post_processing();
virtual void do_pre_processing();
virtual void do_print() const;
virtual void do_substitute_element_pointer (Score_element*,Score_element*);
Real distance_f_;
void add_to_cols ();
- Rod (Single_malt_grouping_item*,Single_malt_grouping_item*);
Rod ();
};
The columns which contain data have a rhythmical
position. Score_column is the type with a rhythmical time attached
to it. The calculation of idealspacing is done with data in these
- columns. (notably: the #durations# field)
+ columns.
*/
friend class Score;
friend class Score_engraver;
- bool musical_b_;
int break_penalty_i_;
Moment when_;
-
public:
+ Moment shortest_playing_mom_;
+ Moment shortest_starter_mom_;
+
int break_penalty_i () { return break_penalty_i_; }
VIRTUAL_COPY_CONS(Score_element);
- /// length of notes/rests in this column
- Array<Moment> durations;
-
-
- Moment when() { return when_; }
- Score_column (Moment when, bool musical_b=false);
- void add_duration (Moment);
- void preprocess();
- bool musical_b() { return musical_b_; }
+
+ Moment when_mom() { return when_; }
+ Score_column (Moment when);
+
+ bool musical_b() const;
void do_print() const;
};
*/
class Slur : public Bow
{
+ bool broken_edge_b ( Direction dir) const;
+ bool normal_edge_b ( Direction dir) const;
+ Drul_array<Note_column*> extrema () const;
+
public:
Slur ();
VIRTUAL_COPY_CONS(Score_element);
protected:
virtual Array<Offset> get_encompass_offset_arr () const;
- virtual void set_default_dir ();
+ virtual Direction get_default_dir () const;
virtual void do_post_processing ();
virtual void do_add_processing ();
virtual void do_pre_processing ();
/// make the energy function
void make_matrices (Matrix &quad, Vector &lin,Real&) const;
- void get_ruling_durations(Array<Moment>&, Array<Moment>&);
+ void get_ruling_durations(Array<Moment>&);
/// generate the LP constraints
void make_constraints (Mixed_qp& lp) const;
Direction get_dir () const;
int get_center_distance(Direction) const;
- void set_default_dir();
+
void set_default_stemlen();
void set_default_extents();
void set_noteheads();
protected:
virtual void do_add_processing ();
virtual void do_post_processing ();
- virtual void set_default_dir();
+ virtual Direction get_default_dir() const;
virtual void do_substitute_element_pointer (Score_element*,Score_element*);
virtual Array<Rod> get_rods () const;
--- /dev/null
+/*
+ compressed-music-iterator.hh -- declare Time_scaled_music_iterator
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#ifndef Time_scaled_music_ITERATOR_HH
+#define Time_scaled_music_ITERATOR_HH
+
+#include "music-wrapper-iterator.hh"
+
+class Time_scaled_music_iterator : public Music_wrapper_iterator
+{
+public:
+ // construction
+protected:
+ virtual void do_process_and_next (Moment);
+};
+
+
+#endif /* Time_scaled_music_ITERATOR_HH */
+
--- /dev/null
+/*
+ compressed-music.hh -- declare Time_scaled_music
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#ifndef Time_scaled_music_HH
+#define Time_scaled_music_HH
+
+#include "music-wrapper.hh"
+/**
+ Tempo expansion or compression.
+ */
+class Time_scaled_music : public Music_wrapper
+{
+public:
+ int num_i_;
+ int den_i_;
+
+ Time_scaled_music (int, int, Music *);
+
+ VIRTUAL_COPY_CONS(Music);
+};
+
+#endif /* Time_scaled_music_HH */
+
protected:
- Link_array<Compressed_music> compressed_music_arr_;
+ Link_array<Time_scaled_music> time_scaled_music_arr_;
Array<Moment> stop_moments_;
Link_array<Tuplet_spanner> started_span_p_arr_;
#include "pointer.hh"
#include "directional-spanner.hh"
-/** supportable plet: triplets, eentweetjes, ottava, etc. */
+/** supportable plet: triplets, eentweetjes, ottava, etc.
+ TODO: quantise, we don't want to collide with staff lines.
+ (or should we be above staff?)
+
+ todo: handle breaking elegantly.
+*/
class Tuplet_spanner : public Directional_spanner
{
public:
Tuplet_spanner ();
void add_column (Note_column*);
- void set_beam (Beam*);
+ void add_beam (Beam*);
String number_str_;
+
/*
junk us.
*/
bool num_visibility_b_;
protected:
- Beam *beam_l_;
+ Link_array<Beam> beam_l_arr_;
Link_array<Note_column> column_arr_;
virtual Molecule* do_brew_molecule_p () const;
VIRTUAL_COPY_CONS(Score_element);
-
virtual void do_add_processing ();
virtual void do_post_processing ();
- virtual void set_default_dir ();
+ virtual Direction get_default_dir () const;
virtual void do_substitute_element_pointer (Score_element*,Score_element*);
};
m.translate_axis (calculate_position(pitch_arr_[i], acc_arr_[i]) * inter, Y_AXIS);
output->add_at_edge (X_AXIS, RIGHT, m, 0);
}
+
if (pitch_arr_.size())
{
Molecule m (lookup_l ()->fill (Box (
delete p;
return r;
}
+
+/*
+ Layout of nodes:
+
+ (key . (left_child . right_child))
+
+ SCM_EOL is the nil-pointer (should use SCM_NIMP() ?)
+ */
+
+#define left_child(s) SCM_CADR((s))
+#define right_child(s) SCM_CDDR((s))
+#define key(s) SCM_CAR((s))
+
+/*
+ Garble pointers, to prevent unbalanced tree due to ordered inserts.
+ */
+
+unsigned int
+munge (SCM s)
+{
+ const int SHIFT = 18;
+ return (unsigned int)(s << (32-SHIFT) | s >> SHIFT );
+}
+
+SCM
+ly_new_bintree_node (SCM val)
+{
+ return gh_cons (val, gh_cons (SCM_EOL, SCM_EOL));
+}
+
+
+/*
+ add VAL to TREE. TREE must be non-nil
+ */
+void
+ly_addto_bintree (SCM *tree, SCM val)
+{
+ while(*tree != SCM_EOL)
+ {
+ if (munge (val) <= munge (key (*tree)))
+ tree = &left_child (*tree);
+ else
+ tree = &right_child (*tree);
+ }
+
+ *tree = ly_new_bintree_node (val);
+}
+
+
+/*
+ find the address of a node in the tree represented by *NODE with key VAL
+ */
+SCM *
+ly_find_in_bintree (SCM *node, SCM val)
+{
+ while (*node != SCM_EOL)
+ {
+ if (munge (val) < munge (key(*node) ))
+ node = &left_child(*node);
+ else if (munge (val) > munge (key (*node)))
+ node = &right_child (*node);
+ else
+ return node;
+ }
+ return node;
+}
+
+void
+ly_remove_from_bintree (SCM *node)
+{
+ SCM r = right_child (*node);
+ SCM l = left_child (*node);
+
+ if (r == SCM_EOL)
+ {
+ *node = l;
+ }
+ else if (l == SCM_EOL)
+ {
+ *node = r;
+ }
+ else
+ {
+ /*deleting from binary trees. See Knuth's TAOCP.
+ */
+ SCM *t = node;
+ SCM *left_t = &left_child (*t);
+
+ /*
+ INV: LEFT_T is the left child of T
+ */
+ while (*left_t != SCM_EOL)
+ {
+ t = left_t;
+ left_t = &left_child (*t);
+ }
+
+ /*
+ POST: T is the leftmost right child of NODE which has no left child,
+
+ leftchild (LASTT) == T
+ */
+ key(*node) = key(*t);
+ *left_t = right_child (*t);
+ }
+}
+
+
+static SCM protect_tree_root;
+
+SCM
+ly_protect_scm (SCM s)
+{
+ ly_addto_bintree (&protect_tree_root, s);
+ return s;
+}
+
+SCM
+ly_unprotect_scm (SCM s)
+{
+ SCM *to_remove = ly_find_in_bintree (&protect_tree_root, s);
+
+ /*
+ this shouldn't happen, according to me. But it does.
+ */
+ if (*to_remove != SCM_EOL)
+ ly_remove_from_bintree (to_remove);
+ return s;
+}
+
+void
+ly_init_protection ()
+{
+ protect_tree_root = scm_protect_object (ly_new_bintree_node(SCM_EOL));
+ key (protect_tree_root) = protect_tree_root;
+}
+
+
+int
+ly_count_elements (SCM tree)
+{
+ if (tree == SCM_EOL)
+ return 0;
+ else
+ return 1 + ly_count_elements (left_child (tree)) + ly_count_elements (right_child( tree));
+}
+
+int
+ly_tree_depth (SCM tree)
+{
+ if (tree == SCM_EOL)
+ return 0;
+ else
+ return 1 + (ly_tree_depth (left_child (tree)) >? ly_tree_depth (right_child(tree)));
+}
+
+void
+ly_print_bintree (SCM node)
+{
+#ifndef NPRINT
+ if (node == SCM_EOL)
+ return;
+ DOUT << "{val = " << key(node) << " \nleft = ";
+ ly_print_bintree (left_child (node));
+ DOUT << "\n right =";
+ ly_print_bintree (right_child (node));
+ DOUT << "}";
+#endif
+}
+
+
+struct Imbalance { int imbalance; int total; };
+
+Imbalance
+ly_calc_imbalance (SCM node)
+{
+ Imbalance t;
+ if (node == SCM_EOL)
+ {
+ t.imbalance = 0;
+ t.total = 0;
+ return t;
+ }
+
+ Imbalance l = ly_calc_imbalance (left_child (node));
+ Imbalance r = ly_calc_imbalance (right_child (node));
+
+ t.total = l.total + r.total + 1;
+ int dif = l.total - r.total;
+ if (dif < 0)
+ dif = -dif;
+ t.imbalance = l.imbalance + r.imbalance + dif;
+ return t;
+}
TODO
Glissando
+
+ merge rulesym and filledbox.
*/
#include <ctype.h>
Adobe_font_char_metric cm = afm_l_->find_char (s, warn);
Molecule m;
if (cm.code () < 0)
- return m;
-
+ {
+ /*
+ don't want people relying on this kind of dimension.
+ */
+ m.set_empty (false);
+ return m;
+ }
+
Atom at (gh_list (char_scm_sym,
gh_int2scm (cm.code ()),
SCM_UNDEFINED));
}
Atom at
- (gh_list (ly_symbol ("dashed-slur"),
- gh_double2scm (thick),
- gh_double2scm (dash),
- ly_quote_scm (array_to_list (sc, 4)),
- SCM_UNDEFINED));
+ (gh_list (ly_symbol ("dashed-slur"),
+ gh_double2scm (thick),
+ gh_double2scm (dash),
+ ly_quote_scm (array_to_list (sc, 4)),
+ SCM_UNDEFINED));
m.add_atom (&at);
Lookup::rule_symbol (Real height, Real width) const
{
Atom at (gh_list (rulesym_scm_sym,
- gh_double2scm (height),
- gh_double2scm (width),
- SCM_UNDEFINED));
+ gh_double2scm (height),
+ gh_double2scm (width),
+ SCM_UNDEFINED));
Molecule m;
m.dim_.x () = Interval (0, width);
Molecule m;
Atom at (gh_list (filledbox_scm_sym,
- gh_double2scm (-b[X_AXIS][LEFT]),
- gh_double2scm (b[X_AXIS][RIGHT]),
- gh_double2scm (-b[Y_AXIS][DOWN]),
- gh_double2scm (b[Y_AXIS][UP]),
- SCM_UNDEFINED));
+ gh_double2scm (-b[X_AXIS][LEFT]),
+ gh_double2scm (b[X_AXIS][RIGHT]),
+ gh_double2scm (-b[Y_AXIS][DOWN]),
+ gh_double2scm (b[Y_AXIS][UP]),
+ SCM_UNDEFINED));
m.dim_ = b;
m.add_atom (&at);
/*
UGH.
- */
+ */
SCM l = gh_eval_str (("(style-to-cmr \"" + style + "\")").ch_C());
if (l != SCM_BOOL_F)
{
}
-/*
- */
Molecule
Lookup::time_signature (int num, int den) const
{
String sty = "number";
Molecule n (text (sty, to_str (num)));
Molecule d (text (sty, to_str (den)));
- n.do_center (X_AXIS);
- d.do_center (X_AXIS);
+ n.align_to (X_AXIS, CENTER);
+ d.align_to (X_AXIS, CENTER);
Molecule m;
if (den)
{
else
{
m = n;
- m.do_center (Y_AXIS);
+ m.align_to (Y_AXIS, CENTER);
}
return m;
}
Molecule m;
Atom at (gh_list (pianobrace_scm_sym,
- gh_double2scm (y),
- SCM_UNDEFINED
- ));
+ gh_double2scm (y),
+ SCM_UNDEFINED
+ ));
m.dim_[Y_AXIS] = Interval (-y/2,y/2);
m.dim_[X_AXIS] = Interval (0,0);
String hairpin = String (decresc ? "de" : "") + "crescendo";
Atom at (gh_list (ly_symbol (hairpin),
- gh_double2scm (width),
- gh_double2scm (height),
- gh_double2scm (continued ? height/2 : 0.0),
- SCM_UNDEFINED));
+ gh_double2scm (width),
+ gh_double2scm (height),
+ gh_double2scm (continued ? height/2 : 0.0),
+ SCM_UNDEFINED));
m.dim_.x () = Interval (0, width);
m.dim_.y () = Interval (-2*height, 2*height);
{
t = paper_l_->get_realvar (thick);
}
-
+
+ Real interline_f = paper_l_->get_realvar (interline_scm_sym);
Atom at (gh_list(tuplet_scm_sym,
- gh_double2scm (dx),
- gh_double2scm (dy),
- gh_double2scm (t),
- gh_int2scm (dir),
- SCM_UNDEFINED));
-m.add_atom (&at);
+ gh_double2scm (interline_f),
+ gh_double2scm (dx),
+ gh_double2scm (dy),
+ gh_double2scm (t),
+ gh_int2scm (dir),
+ SCM_UNDEFINED));
+ m.add_atom (&at);
return m;
}
Atom at (gh_list (ly_symbol ("bezier-sandwich"),
- ly_quote_scm (array_to_list (scontrols, 8)),
- SCM_UNDEFINED));
+ ly_quote_scm (array_to_list (scontrols, 8)),
+ SCM_UNDEFINED));
m.dim_[X_AXIS] = Interval (0, delta_off[X_AXIS]);
m.dim_[Y_AXIS] = Interval (0 <? delta_off[Y_AXIS], 0 >? delta_off[Y_AXIS]);
{
Molecule m;
Atom at ( gh_list (bracket_scm_sym,
- gh_double2scm (y),
- SCM_UNDEFINED));
+ gh_double2scm (y),
+ SCM_UNDEFINED));
m.add_atom (&at);
m.dim_[Y_AXIS] = Interval (-y/2,y/2);
m.dim_[X_AXIS] = Interval (0,4 PT);
t = paper_l_->get_realvar (thick);
}
Atom at (gh_list (volta_scm_sym,
- gh_double2scm (w),
- gh_double2scm (t),
- gh_int2scm (last_b),
- SCM_UNDEFINED));
+ gh_double2scm (w),
+ gh_double2scm (t),
+ gh_int2scm (last_b),
+ SCM_UNDEFINED));
Real interline_f = paper_l_->get_realvar (interline_scm_sym);
text_p_= new G_text_item;
text_p_->text_str_ = req_l_->text_str_;
- Scalar style = get_property ("textstyle", 0);
+ Scalar style = get_property ("textStyle", 0);
if (style.length_i ())
text_p_->style_str_ = style;
/*
need to do this first. Engravers use lily.scm contents.
*/
+ extern void ly_init_protection();
+ ly_init_protection();
init_symbols ();
read_lily_scm_file ( "lily.scm");
cout << endl;
String str = Midi_chunk::data_str ();
if (check_debug && !monitor->silent_b ("Midistrings"))
str += "\n";
- for (Cons<Midi_event>* i = event_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+ for (Cons<Midi_event> *i=event_p_list_.head_; i; i = i->next_)
{
- str += i->car_p_->str ();
+ str += i->car_->str ();
if (check_debug && !monitor->silent_b ("Midistrings"))
str += "\n";
}
get_bounds_iv (Array<Real> const& positions, Real x)
{
Slice slice = get_bounds_slice (positions, x);
- return Interval (positions[slice.min ()], positions[slice.max ()]);
+ return Interval (positions[slice[SMALLER]], positions[slice[BIGGER]]);
}
// silly name
}
Slice slice = get_bounds_slice (positions, frac);
- Interval iv(positions[slice.min ()], positions[slice.max ()]);
+ Interval iv(positions[slice[SMALLER]], positions[slice[BIGGER]]);
- if (slice.min () == slice.max ())
+ if (slice[SMALLER] == slice[BIGGER])
{
- if (slice.min () == 0)
- iv.min () = - period + positions.top ();
+ if (slice[SMALLER] == 0)
+ iv[SMALLER] = - period + positions.top ();
else
- iv.max () = period + positions[0];
+ iv[BIGGER] = period + positions[0];
}
iv += period * n;
#define UNBOX_PTR(a) SCM_CAR(a)
#else
#define MOL_EOL 0
-#define NEXT_CELL(a) ptr->next_cons_p_
+#define NEXT_CELL(a) ptr->next_
#define CELLTYPE Cons<Atom>*
#define UNBOX_ATOM(a) a
-#define UNBOX_PTR(a) a->car_p_
+#define UNBOX_PTR(a) a->car_
#define BOX_ATOM(a) a
#define NEWCELL(a,b) new Killing_cons<Atom>(a,b)
#endif
{
UNBOX_ATOM(UNBOX_PTR(ptr))->off_ += o;
}
- dim_.translate (o);
+ if (!empty_b ())
+ dim_.translate (o);
}
void
for (CELLTYPE ptr = atom_list_; ptr != MOL_EOL; ptr = NEXT_CELL(ptr))
UNBOX_ATOM (UNBOX_PTR(ptr))->off_[a] += x;
- dim_[a] += x;
+ if (!empty_b ())
+ dim_[a] += x;
}
void
atom_list_ = NEWCELL(BOX_ATOM(a), atom_list_);
}
-
-
-
void
Molecule::operator=(Molecule const & src)
{
- if (&src == this)
- return;
-
-
+ if (&src == this) return;
#ifndef ATOM_SMOB
delete atom_list_;
add_molecule (src);
}
+void
+Molecule::set_empty (bool e)
+{
+ if (e)
+ {
+ dim_[X_AXIS].set_empty ();
+ dim_[Y_AXIS].set_empty ();
+ }
+ else
+ {
+ dim_[X_AXIS] = Interval(0,0);
+ dim_[Y_AXIS] = Interval (0,0);
+ }
+}
+
Molecule::Molecule (Molecule const &s)
{
atom_list_ = MOL_EOL;
+ set_empty (true);
add_molecule (s);
}
}
void
-Molecule::do_center (Axis a)
+Molecule::align_to (Axis a, Direction d)
{
- Interval i (extent (a));
- translate_axis (-i.center (), a);
+ if (d == CENTER)
+ {
+ Interval i (extent (a));
+ translate_axis (-i.center (), a);
+ }
+ else
+ {
+ translate_axis (-extent (a)[d], a);
+ }
}
Molecule::Molecule ()
{
- dim_ = Box (Interval(0,0),Interval( 0,0 ));
+ dim_[X_AXIS].set_empty ();
+ dim_[Y_AXIS].set_empty ();
atom_list_ = MOL_EOL;
}
void
Molecule::add_at_edge (Axis a, Direction d, Molecule const &m, Real padding)
{
- Real my_extent= dim_[a][d];
+ Real my_extent= empty_b () ? 0.0 : dim_[a][d];
+ Interval i (m.extent ()[a]);
+ if (i.empty_b ())
+ warning ("Molecule::add_at_edge: adding empty molecule. [PROGRAMMING ERROR]");
- Real offset = my_extent - m.extent ()[a][-d];
+ Real his_extent = i[-d];
+ Real offset = my_extent - his_extent;
Molecule toadd (m);
toadd.translate_axis (offset + d * padding, a);
add_molecule (toadd);
}
bool
-Molecule::empty_b() const
+Molecule::empty_b () const
{
return atom_list_ == MOL_EOL;
}
#include "change-translator.hh"
#include "music-wrapper.hh"
#include "music-wrapper-iterator.hh"
-#include "compressed-music-iterator.hh"
-#include "compressed-music.hh"
+#include "time-scaled-music-iterator.hh"
+#include "time-scaled-music.hh"
#include "repeated-music.hh"
#include "repeated-music-iterator.hh"
p = new Property_iterator;
else if (dynamic_cast<Change_translator const *> (m))
p = new Change_iterator;
- else if (dynamic_cast<Compressed_music const *> (m))
- p = new Compressed_music_iterator;
+ else if (dynamic_cast<Time_scaled_music const *> (m))
+ p = new Time_scaled_music_iterator;
else if (dynamic_cast<Music_wrapper const *> (m))
p = new Music_wrapper_iterator;
else if (dynamic_cast<Repeated_music const *> (m))
Simultaneous_music::length_mom () const
{
Moment dur = 0;
- for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_)
- dur = dur >? i->car_p_->length_mom ();
+ for (Cons<Music> *i = music_p_list_p_->head_; i; i = i->next_)
+ dur = dur >? i->car_->length_mom ();
return dur;
}
void
Music_sequence::compress (Moment m)
{
-
- for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_)
- i->car_p_->compress (m);
+ for (Cons<Music> *i = music_p_list_p_->head_; i; i = i->next_)
+ i->car_->compress (m);
}
Simultaneous_music::Simultaneous_music(Music_list *p)
Sequential_music::length_mom () const
{
Moment last=0;
- for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_)
+ for (Cons<Music> *i = music_p_list_p_->head_; i; i = i->next_)
{
- last += i->car_p_->length_mom ();
+ last += i->car_->length_mom ();
}
return last;
}
{
Musical_pitch retval;
int count=0;
- for (Cons<Music> *i = head_cons_p_; i ; i = i->next_cons_p_)
+ for (Cons<Music> *i = head_; i ; i = i->next_)
{
- last = i->car_p_->to_relative_octave (last);
+ last = i->car_->to_relative_octave (last);
if (!count ++ )
retval = last;
}
Music_list::Music_list (Music_list const &s)
: Cons_list<Music> (s)
{
- init ();
- clone_killing_cons_list (*this, s.head_cons_p_);
+ init_list ();
+ clone_killing_cons_list (*this, s.head_);
}
Musical_pitch
Request_chord::to_relative_octave (Musical_pitch last)
{
- for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i ; i = i->next_cons_p_)
+ for (Cons<Music> *i = music_p_list_p_->head_; i ; i = i->next_)
{
- if (Melodic_req *m= dynamic_cast <Melodic_req *> (i->car_p_))
+ if (Melodic_req *m= dynamic_cast <Melodic_req *> (i->car_))
{
Musical_pitch &pit = m->pitch_;
pit.to_relative_octave (last);
String
Music_output_def::get_default_output () const
{
- static SCM output_sym;
- if (!output_sym)
- output_sym = scm_protect_object (output_scm_sym);
- if (safe_global_b || !scope_p_->elem_b (output_sym))
+ if (safe_global_b || !scope_p_->elem_b (output_scm_sym))
return "";
- Identifier * id = scope_p_->elem (output_sym);
+ Identifier * id = scope_p_->elem (output_scm_sym);
String *p = id->access_content_String (false);
return p ? *p : String ("");
void
Music_sequence::transpose (Musical_pitch rq)
{
- for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_)
- i->car_p_->transpose (rq);
+ for (Cons<Music> *i = music_p_list_p_->head_; i; i = i->next_)
+ i->car_->transpose (rq);
}
void
Music_sequence::do_print() const
{
#ifndef NPRINT
- for (Cons<Music> *i = music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_)
- i->car_p_->print();
+ for (Cons<Music> *i = music_p_list_p_->head_; i; i = i->next_)
+ i->car_->print();
#endif
}
{
return element_p_;
}
+
+void
+Music_wrapper::compress (Moment m)
+{
+ element_l ()->compress (m);
+}
*/
#include "dot-column.hh"
#include "note-column.hh"
-
+#include "beam.hh"
#include "note-head.hh"
#include "stem.hh"
#include "rest.hh"
#include "debug.hh"
+#include "paper-def.hh"
bool
Note_column::rest_b () const
{
add_element (d);
}
+
+ /*
+ [TODO]
+ handle rest under beam (do_post: beams are calculated now)
+ what about combination of collisions and rest under beam.
+
+ Should lookup
+
+ rest -> stem -> beam -> interpolate_y_position ()
+
+ */
+
+void
+Note_column::do_post_processing ()
+{
+ if (!stem_l_ || !rest_b ())
+ return;
+
+ Beam * b = stem_l_->beam_l_;
+ if (!b)
+ return;
+
+ /* ugh. Should be done by beam. */
+ Real x = stem_l_->hpos_f ();
+ Direction d = stem_l_->get_dir ();
+ Real beamy = x * b->slope_f_ + b->left_y_;
+ Interval restdim = extent (Y_AXIS);
+
+ Real staff_space = rest_l_arr_[0]->staff_line_leading_f ();
+ Real internote_f = staff_space/2;
+ Real minimum_dist
+ = paper_l ()->get_var ("restcollision_minimum_beamdist") * internote_f;
+ Real dist =
+ minimum_dist + -d * (beamy - restdim[d]) >? 0;
+
+ int stafflines = rest_l_arr_[0]->lines_i ();
+
+ // move discretely by half spaces.
+ int discrete_dist = int (ceil (dist / (0.5 *staff_space)));
+
+ // move by whole spaces inside the staff.
+ if (discrete_dist < stafflines+1)
+ discrete_dist = int (ceil (discrete_dist / 2.0)* 2.0);
+
+ translate_rests (-d * discrete_dist);
+}
Paper_column::add_rod (Paper_column * p, Real d)
{
Direction dir = Direction (sign (p->rank_i () - rank_i ()));
+
+ if (!dir)
+ {
+ warning ("Must set minimum distance between differing columns. [PROGRAMMING ERROR]");
+ return;
+ }
+
for (int i=0; i < minimal_dists_arr_drul_[dir].size (); i++)
{
Column_rod &rod = minimal_dists_arr_drul_[dir][i];
Column_rod cr;
cr.distance_f_ = d;
- cr.other_l_ = p;
+ cr.other_l_ = p;
minimal_dists_arr_drul_[dir].push (cr);
-
}
int
{
#ifndef NPRINT
DOUT << "rank: " << rank_i_ << '\n';
- if (prebreak_l())
- {
- DOUT << "\npre: ";
- prebreak_l()->print();
- }
- if (postbreak_l())
- {
- DOUT << "post: ";
- postbreak_l()->print();
- }
- if (break_status_dir ())
- {
- DOUT << '\n' << ((break_status_dir () == LEFT) ? "prebreak" : "postbreak");
- DOUT << '\n';
- }
-
- DOUT << "Left: ";
for (int i=0; i < minimal_dists_arr_drul_[LEFT].size (); i++)
{
minimal_dists_arr_drul_[LEFT][i].print ();
{
minimal_dists_arr_drul_[RIGHT][i].print ();
}
+ Item::do_print ();
#endif
}
-int
-Paper_column::compare (Paper_column const &c1, Paper_column const &c2)
-{
- return c1.rank_i() - c2.rank_i ();
-}
-
-Paper_column*
-Paper_column::prebreak_l() const
-{
- return dynamic_cast<Paper_column*>(find_prebroken_piece (LEFT));
-}
-
-Paper_column*
-Paper_column::postbreak_l() const
-{
- return dynamic_cast<Paper_column*>( find_prebroken_piece (RIGHT));
-}
-
bool
Paper_column::breakpoint_b() const
{
{
if (multiplicity_i <= 3)
return get_realvar (interbeam_scm_sym);
- else
- return get_realvar (interbeam4_scm_sym);
- }
+ else
+ return get_realvar (interbeam4_scm_sym);
+}
Real
Paper_def::note_width () const
{
return get_realvar (notewidth_scm_sym);
- }
+}
void
Paper_def::print () const
{
Atom *i = Atom::atom_l (SCM_CAR(ptr));
#else
- for (Cons<Atom> *ptr = m->atom_list_; ptr; ptr = ptr->next_cons_p_)
+ for (Cons<Atom> *ptr = m->atom_list_; ptr; ptr = ptr->next_)
{
- Atom * i = ptr->car_p_;
+ Atom * i = ptr->car_;
#endif
Offset a_off = i->off_;
a_off += o;
#include "scope.hh"
#include "relative-music.hh"
#include "transposed-music.hh"
-#include "compressed-music.hh"
+#include "time-scaled-music.hh"
#include "repeated-music.hh"
// mmm
;
Alternative_music:
- ALTERNATIVE Simultaneous_music {
+ /* empty */ {
+
+ /* UGH*/
+ Music_list* m = new Music_list;
+ $$ = new Sequential_music (m);
+ }
+ | ALTERNATIVE Simultaneous_music {
$$ = $2;
}
| ALTERNATIVE Sequential_music {
| translator_change
| Simple_music '*' unsigned '/' unsigned {
/* urg */
- $$ = new Compressed_music ($3, $5, $1);
+ $$ = new Time_scaled_music ($3, $5, $1);
}
| Simple_music '*' unsigned {
- $$ = new Compressed_music ($3, 1, $1);
+ $$ = new Time_scaled_music ($3, 1, $1);
}
;
unsigned '/' unsigned Music
{
- $$ = new Compressed_music ($3, $5, $6);
+ $$ = new Time_scaled_music ($3, $5, $6);
$$->set_spot (THIS->pop_spot ());
}
| Repeated_music { $$ = $1; }
delete $1;
n->duration_ = *$4;
delete $4;
- n->forceacc_b_ = $2 % 2;
n->cautionary_b_ = $3 % 2;
+ n->forceacc_b_ = $2 % 2 || n->cautionary_b_;
Simultaneous_music*v = new Request_chord;
v->set_spot (THIS->here_input ());
#ifndef NPRINT
DOUT << "Performance { ";
DOUT << "Items: ";
- for (Cons<Audio_element>* i =audio_elem_p_list_; i; i = i->next_cons_p_)
- i->car_p_->print ();
+ for (Cons<Audio_element>* i =audio_elem_p_list_; i; i = i->next_)
+ i->car_->print ();
DOUT << "}";
#endif
}
*/
#include "protected-scm.hh"
-extern "C"
-{
-#include <libguile/gc.h>
-};
+#include "lily-guile.hh"
+#include "main.hh"
+#ifdef LYPROT
+#define PROTECT ly_protect_scm
+#define UNPROTECT ly_unprotect_scm
+#else
+#define PROTECT scm_protect_object
+#define UNPROTECT scm_unprotect_object
+#endif
Protected_scm::Protected_scm ()
{
Protected_scm::Protected_scm (SCM s)
{
- object_ = s ? scm_protect_object (s): 0;
+ object_ = s ? PROTECT (s): 0;
}
Protected_scm::Protected_scm (Protected_scm const &s)
{
- object_ = s.object_ ? scm_protect_object (s.object_) : 0;
+ object_ = s.object_ ? PROTECT (s.object_) : 0;
}
Protected_scm &
-Protected_scm::operator =(Protected_scm const &s)
+Protected_scm::operator =(SCM s)
{
- if (this == &s)
+ if (object_ == s)
return *this;
if (object_)
- scm_unprotect_object(object_);
+ UNPROTECT(object_);
- object_ = (s.object_) ? scm_protect_object (s.object_): 0;
+ object_ = s ? PROTECT (s): 0;
return *this;
}
+Protected_scm&
+Protected_scm::operator = (Protected_scm const &s)
+{
+ return operator= (s.object_);
+}
+
+
Protected_scm::~Protected_scm ()
{
if (object_)
{
- scm_unprotect_object (object_);
+ UNPROTECT (object_);
object_ =0L; // be nice to conservative GC
}
}
Moment alt_mom = now_mom () + repeat_length_mom;
if (repeat_length_mom)
{
- for (Cons<Music> *i (alt->music_p_list_p_->head_cons_p_); i && i->next_cons_p_; i = i->next_cons_p_)
+ for (Cons<Music> *i (alt->music_p_list_p_->head_); i && i->next_; i = i->next_)
{
- stop_mom += i->car_p_->length_mom ();
+ stop_mom += i->car_->length_mom ();
if (dynamic_cast<Simultaneous_music *> (alt))
break;
}
if (prop.length_i ())
span_mom = prop.to_rat ();
- int alt_i = r->repeats_i_ + 1 - cons_list_size_i (alt->music_p_list_p_->head_cons_p_ ) >? 1;
- for (Cons<Music> *i = alt->music_p_list_p_->head_cons_p_; i ; i = i->next_cons_p_)
+ int alt_i = r->repeats_i_ + 1 - cons_list_size_i (alt->music_p_list_p_->head_ ) >? 1;
+ for (Cons<Music> *i = alt->music_p_list_p_->head_; i ; i = i->next_)
{
- alternative_music_arr_.push (i->car_p_);
+ alternative_music_arr_.push (i->car_);
alternative_start_mom_arr_.push (alt_mom);
if (span_mom)
alternative_stop_mom_arr_.push (alt_mom + span_mom);
else
- alternative_stop_mom_arr_.push (alt_mom + i->car_p_->length_mom ());
+ alternative_stop_mom_arr_.push (alt_mom + i->car_->length_mom ());
String str;
- if ((alt_i != 1) && (alt_i != r->repeats_i_) && (i == alt->music_p_list_p_->head_cons_p_))
+ if ((alt_i != 1) && (alt_i != r->repeats_i_) && (i == alt->music_p_list_p_->head_))
str = "1.-";
str += to_str (alt_i) + ".";
alt_i++;
alternative_str_arr_.push (str);
if (!dynamic_cast<Simultaneous_music *> (alt))
- alt_mom += i->car_p_->length_mom ();
+ alt_mom += i->car_->length_mom ();
}
return true;
}
{
if (first_b_)
{
- for (Cons<Music> *i = elt_l ()->music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_)
+ for (Cons<Music> *i = elt_l ()->music_p_list_p_->head_; i; i = i->next_)
{
- if (Request * req_l = dynamic_cast<Request*> (i->car_p_))
+ if (Request * req_l = dynamic_cast<Request*> (i->car_))
{
bool gotcha = report_to_l()->try_music (req_l);
if (!gotcha)
req_l->warning (_f ("junking request: `%s\'", classname( req_l)));
}
else
- i->car_p_->warning (_f ("Huh? Not a Request: `%s\'",
- classname (i->car_p_)));
+ i->car_->warning (_f ("Huh? Not a Request: `%s\'",
+ classname (i->car_)));
}
first_b_ = false;
}
void
Rest_collision_engraver::process_acknowledged ()
{
- if (rest_collision_p_ || note_column_l_arr_.size () < 2)
+ if (rest_collision_p_ || note_column_l_arr_.size () < 2)
return;
rest_collision_p_ = new Rest_collision;
(c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-
+#include "beam.hh"
#include "debug.hh"
#include "rest-collision.hh"
#include "note-column.hh"
#include "note-head.hh"
#include "collision.hh"
#include "paper-def.hh"
+#include "rest.hh"
void
Rest_collision::add_column (Note_column *nc_l)
ncol_l_arr_.push (nc_l);
}
-void
-Rest_collision::do_post_processing()
-{
- /*
- [TODO]
- handle rest under beam (do_post: beams are calculated now)
- what about combination of collisions and rest under beam
- */
-}
-
void
Rest_collision::do_pre_processing()
{
handle rest-rest and rest-note collisions
[todo]
- decide not to print rest if too crowded?
+ * decide not to print rest if too crowded?
+
+ * ignore rests under beams.
*/
// no rests to collide
// meisjes met meisjes
if (!ncol_l_arr_.size())
{
+ /*
+ UGH. Should get dims from table. Should have minimum dist.
+ */
int dy = rest_l_arr_.size() > 2 ? 6 : 4;
rest_l_arr_[0]->translate_rests (rest_l_arr_[0]->dir () *dy);
- // top is last element...
- rest_l_arr_.top()->translate_rests (rest_l_arr_.top ()->dir ()* dy);
+ rest_l_arr_.top()->translate_rests (rest_l_arr_.top ()->dir ()* dy);
}
// meisjes met jongetjes
else
{
- // int dir_i = - ncol_l_arr_[0]->dir_;
- Direction dir = rest_l_arr_[0]->dir ();
-
- // minimum move
- int minpos = 4;
-
- // quart rest height
- // UGH Should get dims from table!
- int size_i = 6;
-
+ if (rest_l_arr_.size () > 1)
+ {
+ warning (_("Too many colliding rests."));
+ }
+ if (ncol_l_arr_.size () > 1)
+ {
+ warning (_("Too many notes for rest collision."));
+ }
+ Note_column * rcol = rest_l_arr_[0];
+ // try to be opposite of noteheads.
+ Direction dir = - ncol_l_arr_[0]->dir();
+
+ Interval restdim;
+ for (int i=0; i < rcol->rest_l_arr_.size(); i++)
+ restdim.unite (rcol->rest_l_arr_[i]->extent (Y_AXIS));
+
+ if (restdim.empty_b ())
+ return;
+
// staff ref'd?
- Real internote_f = paper_l ()->get_realvar (interline_scm_sym)/2.0;
- int sep_i = 3 + size_i / 2;
+ Real staff_space = rcol->rest_l_arr_[0]->staff_line_leading_f ();
+ Real internote_f = staff_space/2;
+ Real minimum_dist = paper_l ()->get_var ("restcollision_minimum_dist")
+ * internote_f;
+
+ /*
+ assumption: ref points are the same.
+ */
+ Interval notedim;
for (int i = 0; i < ncol_l_arr_.size(); i++)
{
- // how to know whether to sort?
- ncol_l_arr_[i]->sort();
- for (int j = 0; j < ncol_l_arr_[i]->head_l_arr_.size(); j++)
- {
- int stem = (int)((ncol_l_arr_[i]->stem_l_->extent
- (Y_AXIS)[dir]) / internote_f);
- minpos = minpos >? (dir * stem + sep_i);
- }
+ notedim.unite (ncol_l_arr_[i]->extent (Y_AXIS));
}
- rest_l_arr_[0]->translate_rests (dir * minpos);
+
+ Interval inter (notedim);
+ inter.intersect (restdim);
+
+ Real dist =
+ minimum_dist + dir * (notedim[dir] - restdim[-dir]) >? 0;
+
+
+ int stafflines = rcol->rest_l_arr_[0]->lines_i ();
+
+
+ // move discretely by half spaces.
+ int discrete_dist = int (ceil (dist / (0.5 *staff_space)));
+
+ // move by whole spaces inside the staff.
+ if (discrete_dist < stafflines+1)
+ discrete_dist = int (ceil (discrete_dist / 2.0)* 2.0);
+
+ rcol->translate_rests (dir * discrete_dist);
}
}
void
Rest::do_add_processing ()
{
- if (balltype_i_ > 1)
- position_i_ -= 4;
- else if (balltype_i_ == 0)
+ if (balltype_i_ == 0)
position_i_ += 2;
Rhythmic_head::do_add_processing ();
- if (dots_l_ && balltype_i_ > 1)
+ if (dots_l_ && balltype_i_ > 4)
{
- dots_l_->position_i_ = position_i_ + 4;
+ dots_l_->position_i_ = position_i_ + 3;
+ if (balltype_i_ == 7)
+ dots_l_->position_i_++;
}
}
Molecule *
Rest::do_brew_molecule_p () const
{
- bool streepjes_b = abs(position_i_) > lines_i () / 2 &&
- (balltype_i_ == 0 || balltype_i_ == 1);
+ bool ledger_b =false;
+
+ if (balltype_i_ == 0 || balltype_i_ == 1)
+ ledger_b = abs(position_i_ - (2* balltype_i_ - 1)) > lines_i ();
+
+
String style;
SCM style_sym =get_elt_property (style_scm_sym);
style = ly_scm2string (SCM_CDR(style_sym));
}
- Molecule s(lookup_l ()->rest (balltype_i_, streepjes_b, style));
+ Molecule s(lookup_l ()->rest (balltype_i_, ledger_b, style));
Molecule * m = new Molecule ( Molecule (s));
m->translate_axis (position_i_ * staff_line_leading_f ()/2.0, Y_AXIS);
return m;
#include "single-malt-grouping-item.hh"
-Rod::Rod (Single_malt_grouping_item *l, Single_malt_grouping_item *r)
-{
- item_l_drul_[LEFT] =l;
- item_l_drul_[RIGHT]=r;
-
- Interval li (l->my_width ());
- Interval ri (r->my_width ());
- if (li.empty_b () || ri.empty_b ())
- distance_f_ = 0;
- else
- distance_f_ = li[RIGHT] - ri[LEFT] + 1.5 PT; // ugh
-}
-
Rod::Rod ()
{
distance_f_ = 0.0;
#include "score-column.hh"
#include "command-request.hh"
-Score_column::Score_column (Moment w, bool musical_b)
+Score_column::Score_column (Moment w)
{
break_penalty_i_ = 0;
when_ = w;
- musical_b_ = musical_b;
}
void
Score_column::do_print() const
{
#ifndef NPRINT
- DOUT << "mus "<< musical_b_ << " at " << when_ << '\n';
+ DOUT << " at " << when_ << '\n';
if (break_penalty_i_ >= Break_req::FORCE)
DOUT << "Break forced";
-
- DOUT << "durations: [";
- for (int i=0; i < durations.size(); i++)
- DOUT << durations[i] << " ";
- DOUT << "]\n";
+
+ DOUT << "Shortest playing: " << shortest_playing_mom_ << " shortest starter: " << shortest_starter_mom_;
Paper_column::do_print();
#endif
}
-int
-Moment_compare (Moment const &m1, Moment const &m2)
-{
- return sign (m1-m2);
-}
-
-void
-Score_column::preprocess()
-{
- Paper_column ::preprocess ();
- durations.sort (Moment_compare);
-}
-void
-Score_column::add_duration (Moment d)
+bool
+Score_column::musical_b () const
{
- if (!d)
- {
- warning (_f ("ignoring zero duration added to column at %s",
- when_.str ()));
- return;
- }
-
- for (int i = 0; i< durations.size(); i++)
- {
- if (d == durations[i])
- return ;
- }
- durations.push (d);
+ return shortest_starter_mom_ != Moment(0);
}
-
-
Score_element::~Score_element()
{
- element_property_alist_ = SCM_EOL; // try to be nice to GC.
delete output_p_;
assert (status_i_ >=0);
status_i_ = -1;
return dependency_arr_.size ();
}
-
-
SCM
Score_element::get_elt_property (SCM sym) const
{
#endif
}
-
Paper_def*
Score_element::paper_l () const
{
return pscore_l_->paper_l_;
}
-
Lookup const *
Score_element::lookup_l () const
{
do_add_processing();
}
-
void
Score_element::calculate_dependencies (int final, int busy,
Score_element_method_pointer funcptr)
pscore_l_->schedule_for_delete (this);
}
-
-
/*
VIRTUAL STUBS
*/
-
void
Score_element::do_break_processing()
{
info.origin_grav_l_arr_.push (this);
}
+/* All elements are propagated to the top upon announcement. If
+ something was created during one run of
+ Engraver_group_engraver::do_announces, then
+ announce_info_arr_.size() will be nonzero again
+*/
void
Score_engraver::do_announces()
{
- /* All elements are propagated to the top upon announcement. If
- something was created during one run of
- Engraver_group_engraver::do_announces, then
- announce_info_arr_.size() will be nonzero again
-
- */
while (announce_info_arr_.size())
- {
- for (int i=0; i < announce_info_arr_.size(); i++)
- /*
- TODO
-
- More subtle spacing
- */
- if (announce_info_arr_[i].req_l_)
- {
- if (Rhythmic_req *rq = dynamic_cast <Rhythmic_req *> (announce_info_arr_[i].req_l_))
- {
- musical_column_l_->add_duration (rq->length_mom ());
- }
- }
- Engraver_group_engraver::do_announces();
- }
+ Engraver_group_engraver::do_announces();
}
command_column_l_ =0;
}
if (new_command_l)
- {
- command_column_l_ = new_command_l;
- command_column_l_->musical_b_ = false;
- }
+ command_column_l_ = new_command_l;
+
if (musical_column_l_ && musical_column_l_->linked_b())
{
pscore_p_->add_column (musical_column_l_);
if (new_musical_l)
{
musical_column_l_ = new_musical_l;
- musical_column_l_->musical_b_ = true;
}
}
#include "single-malt-grouping-item.hh"
#include "p-col.hh"
#include "paper-def.hh"
+#include "dimensions.hh"
+
+static Rod
+make_rod (Single_malt_grouping_item *l, Single_malt_grouping_item *r)
+{
+ Rod rod;
+ rod.item_l_drul_[LEFT] =l;
+ rod.item_l_drul_[RIGHT]=r;
+
+ Interval li (l->my_width ());
+ Interval ri (r->my_width ());
+
+ if (li.empty_b () || ri.empty_b ())
+ rod.distance_f_ = 0;
+ else
+ rod.distance_f_ = li[RIGHT] - ri[LEFT];
+
+ return rod;
+}
+
Array<Rod>
Separating_group_spanner::get_rods () const
Single_malt_grouping_item *rb
= dynamic_cast<Single_malt_grouping_item*>(r->find_prebroken_piece (LEFT));
- a.push (Rod (spacing_unit_l_arr_[i], spacing_unit_l_arr_[i+1]));
+ a.push (make_rod(spacing_unit_l_arr_[i], spacing_unit_l_arr_[i+1]));
if (lb)
{
- Rod rod(lb, r);
+ Rod rod(make_rod (lb, r));
rod.distance_f_ += padding_f_;
a.push (rod);
}
if (rb)
{
- a.push (Rod (l, rb));
+ a.push (make_rod (l, rb));
}
if (lb && rb)
{
- Rod rod(lb, rb);
+ Rod rod(make_rod (lb, rb));
rod.distance_f_ += padding_f_;
a.push (rod);
}
}
void
-Separating_group_spanner::do_substitute_element_pointer (Score_element*o, Score_element*n)
+Separating_group_spanner::do_substitute_element_pointer (Score_element*o,
+ Score_element*n)
{
if (dynamic_cast<Single_malt_grouping_item *> (o))
{
}
else
{
- sep_span_p_->padding_f_ = 1.5 * paper_l ()->get_realvar (interline_scm_sym);
+ sep_span_p_->padding_f_ = paper_l ()->get_realvar (ly_symbol ("postBreakPadding"));
}
sep_span_p_->set_bounds (RIGHT, get_staff_info ().command_pcol_l ());
void
Sequential_music_iterator::construct_children()
{
- cursor_ = dynamic_cast<Sequential_music const*> (music_l_)->music_p_list_p_->head_cons_p_;
+ cursor_ = dynamic_cast<Sequential_music const*> (music_l_)->music_p_list_p_->head_;
while (cursor_)
{
{
delete iter_p_;
iter_p_ =0;
- Moment elt_time = cursor_->car_p_->length_mom ();
+ Moment elt_time = cursor_->car_->length_mom ();
here_mom_ += elt_time;
- cursor_ =cursor_->next_cons_p_;
+ cursor_ =cursor_->next_;
}
void
Sequential_music_iterator::start_next_element()
{
assert (!iter_p_);
- iter_p_ = get_iterator_p (cursor_->car_p_);
+ iter_p_ = get_iterator_p (cursor_->car_);
}
void
int j = 0;
Simultaneous_music const *sim = dynamic_cast<Simultaneous_music const*> (music_l_);
- for (Cons<Music> *i = sim->music_p_list_p_->head_cons_p_; i; i = i->next_cons_p_, j++)
+ for (Cons<Music> *i = sim->music_p_list_p_->head_; i; i = i->next_, j++)
{
- Music_iterator * mi = get_iterator_p (i->car_p_);
+ Music_iterator * mi = get_iterator_p (i->car_);
if (mi->ok())
{
if (sim->translator_type_str_.empty_b ())
Simultaneous_music_iterator::do_print() const
{
#ifndef NPRINT
- for (Cons<Music_iterator> *p = children_p_list_.head_cons_p_; p; p = p->next_cons_p_)
- p->car_p_->print();
+ for (Cons<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
+ p->car_->print();
#endif
}
void
Simultaneous_music_iterator::do_process_and_next (Moment until)
{
- for (Cons<Music_iterator> **pp = &children_p_list_.head_cons_p_; *pp; )
+ for (Cons<Music_iterator> **pp = &children_p_list_.head_; *pp; )
{
- Music_iterator * i = (*pp)->car_p_;
+ Music_iterator * i = (*pp)->car_;
if (i->next_moment() == until)
{
i->process_and_next (until);
}
if (!i->ok())
- delete children_p_list_.remove_cons_p (pp);
+ delete children_p_list_.remove_cons (pp);
else
- pp = &(*pp)->next_cons_p_;
+ pp = &(*pp)->next_;
}
Music_iterator::do_process_and_next (until);
}
Moment next;
next.set_infinite (1);
- for (Cons<Music_iterator> *p = children_p_list_.head_cons_p_; p; p = p->next_cons_p_)
- next = next <? p->car_p_->next_moment() ;
+ for (Cons<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
+ next = next <? p->car_->next_moment() ;
return next;
}
bool
Simultaneous_music_iterator::ok() const
{
- return children_p_list_.head_cons_p_;
+ return children_p_list_.head_;
}
warning (_("Single_malt_grouping_item: I've been drinking too much (fixme)"));
continue; /*UGH UGH*/
}
- w.unite (il->extent (X_AXIS) + il->relative_coordinate (&pc->dim_cache_[X_AXIS], X_AXIS));
+
+ Interval iv (il->extent (X_AXIS));
+ if (!iv.empty_b ())
+ {
+ Real off = il->relative_coordinate (&pc->dim_cache_[X_AXIS], X_AXIS);
+ w.unite (iv + off);
+ }
}
return w;
void
-Single_malt_grouping_item::do_substitute_element_pointer (Score_element*o, Score_element*n)
+Single_malt_grouping_item::do_substitute_element_pointer (Score_element*o,
+ Score_element*n)
{
if (dynamic_cast <Item *> (o))
{
add_dependency (n);
}
-void
-Slur::set_default_dir ()
+Direction
+Slur::get_default_dir () const
{
- dir_ = DOWN;
+ Direction d = DOWN;
for (int i=0; i < encompass_arr_.size (); i ++)
{
if (encompass_arr_[i]->dir () < 0)
{
- dir_ = UP;
+ d = UP;
break;
}
}
+ return d;
}
void
return Item::left_right_compare (n1, n2);
}
-static bool
-broken_edge_b (Slur*s, Drul_array<Note_column*>& extrema, Direction dir)
+bool
+Slur::broken_edge_b ( Direction dir) const
{
- return extrema[dir] != s->spanned_drul_[dir];
+ return extrema ()[dir] != spanned_drul_[dir];
}
-static bool
-normal_edge_b (Slur*s, Drul_array<Note_column*>& extrema, Direction dir)
+bool
+Slur::normal_edge_b ( Direction dir) const
{
- Note_column *n = extrema[dir];
- return !broken_edge_b (s, extrema, dir)
+ Note_column *n = extrema ()[dir];
+ return !broken_edge_b ( dir)
&& n->stem_l_
&& n->stem_l_->get_elt_property (transparent_scm_sym) == SCM_BOOL_F
&& n->head_l_arr_.size ();
}
+Drul_array<Note_column*>
+Slur::extrema ()const
+{
+ Drul_array<Note_column*> extrema;
+ extrema[LEFT] = encompass_arr_[0];
+ extrema[RIGHT] = encompass_arr_.top ();
+ return extrema;
+}
+
+/*
+ TODO.
+
+ Unhair this.
+ */
void
Slur::do_post_processing ()
{
encompass_arr_.sort (Note_column_compare);
if (!dir_)
- set_default_dir ();
+ dir_ = get_default_dir ();
Real interline_f = paper_l ()->get_realvar (interline_scm_sym);
Real internote_f = interline_f / 2;
Real gap_f = paper_l ()->get_var ("slur_x_gap");
- Drul_array<Note_column*> extrema;
- extrema[LEFT] = encompass_arr_[0];
- extrema[RIGHT] = encompass_arr_.top ();
Direction d=LEFT;
do
{
- if (broken_edge_b (this, extrema, d))
+ if (broken_edge_b (d))
{
// ugh -- check if needed
dx_f_drul_[d] = -d
/*
normal slur
*/
- else if (normal_edge_b (this, extrema, d))
+ else if (normal_edge_b (d))
{
- Real notewidth_f = extrema[d]->extent (X_AXIS).length ();
- dy_f_drul_[d] = (int)rint (extrema[d]->stem_l_-> extent (Y_AXIS)[dir_]);
+ Real notewidth_f = extrema ()[d]->extent (X_AXIS).length ();
+ dy_f_drul_[d] = (int)rint (extrema ()[d]->stem_l_-> extent (Y_AXIS)[dir_]);
dx_f_drul_[d] += 0.5 * notewidth_f - d * gap_f;
- if (dir_ == extrema[d]->stem_l_->dir_)
+ if (dir_ == extrema ()[d]->stem_l_->dir_)
{
if (dir_ == d)
- dx_f_drul_[d] += 0.5 * (dir_ * d) * d * notewidth_f;
+ dx_f_drul_[d] += 0.5 * dir_ * notewidth_f;
else
- dx_f_drul_[d] += 0.25 * (dir_ * d) * d * notewidth_f;
+ dx_f_drul_[d] += 0.25 * dir_ * notewidth_f;
}
}
else
{
- Real notewidth_f = extrema[d]->extent (X_AXIS).length ();
- dy_f_drul_[d] = (int)rint (extrema[d]->head_positions_interval ()
+ Real notewidth_f = extrema ()[d]->extent (X_AXIS).length ();
+ dy_f_drul_[d] = (int)rint (extrema ()[d]->head_positions_interval ()
[dir_]) * internote_f;
dx_f_drul_[d] += 0.5 * notewidth_f - d * gap_f;
}
dy_f_drul_[d] += dir_ * interline_f;
- if (extrema[d]->stem_l_ && (dir_ == extrema[d]->stem_l_->dir_))
+ if (extrema ()[d]->stem_l_ && (dir_ == extrema ()[d]->stem_l_->dir_))
dy_f_drul_[d] -= dir_ * internote_f;
}
while (flip(&d) != LEFT);
// now that both are set, do dependent
do
{
- if (broken_edge_b (this, extrema, d))
+ if (broken_edge_b (d))
{
Direction u = d;
flip(&u);
/*
Slur should follow line of music
*/
- if (normal_edge_b (this, extrema, LEFT)
- && normal_edge_b (this, extrema, RIGHT)
- && (extrema[LEFT]->stem_l_ != extrema[RIGHT]->stem_l_))
+ if (normal_edge_b (LEFT)
+ && normal_edge_b (RIGHT)
+ && (extrema ()[LEFT]->stem_l_ != extrema ()[RIGHT]->stem_l_))
{
- Real note_dy = extrema[RIGHT]->stem_l_->head_positions ()[dir_]
- - extrema[LEFT]->stem_l_->head_positions ()[dir_];
+ Real note_dy = extrema ()[RIGHT]->stem_l_->head_positions ()[dir_]
+ - extrema ()[LEFT]->stem_l_->head_positions ()[dir_];
Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
/*
Should we always follow note-heads, (like a tie)?
/*
adjust only if no beam gets in the way
*/
- if (!extrema[adjust_dir]->stem_l_->beam_l_
- || (adjust_dir == extrema[adjust_dir]->stem_l_->dir_)
- || (extrema[adjust_dir]->stem_l_->beams_i_drul_[-adjust_dir] < 1))
+ if (!extrema ()[adjust_dir]->stem_l_->beam_l_
+ || (adjust_dir == extrema ()[adjust_dir]->stem_l_->dir_)
+ || (extrema ()[adjust_dir]->stem_l_->beams_i_drul_[-adjust_dir] < 1))
{
dy_f_drul_[adjust_dir] = dy_f_drul_[-adjust_dir]
+ 2 * adjust_dir * realdy;
Real dx = notewidth_f / 2;
- if (adjust_dir != extrema[adjust_dir]->stem_l_->dir_)
+ if (adjust_dir != extrema ()[adjust_dir]->stem_l_->dir_)
dx /= 2;
dx_f_drul_[adjust_dir] -= adjust_dir * dx;
}
Real notewidth = paper_l ()->note_width () * 0.8;
Real gap = paper_l ()->get_var ("slur_x_gap");
+ /*
+ urg. Calcs done wrt the leftmost note. Fixme.
+
+ Calcs ignore possibility of pre/postbreak.
+
+
+ */
+
Offset left = Offset (dx_f_drul_[LEFT], dy_f_drul_[LEFT]);
left[X_AXIS] += encompass_arr_[0]->stem_l_->hpos_f ();
+
Real internote = encompass_arr_[0]->stem_l_->staff_line_leading_f ()/2.0;
/*
int last = encompass_arr_.size () - 1;
// prebreak
- if (encompass_arr_.top () != spanned_drul_[RIGHT])
+ if (broken_edge_b (RIGHT))
last++;
// postbreak
- if (encompass_arr_[0] != spanned_drul_[LEFT])
+ if (broken_edge_b (LEFT))
first--;
Array<Offset> notes;
notes.push (Offset (0,0));
- for (int i = first; i < last; i++)
+ Real dy =0.0;
+ for (int i = 0; i < last; i++)
{
Encompass_info info (encompass_arr_[i], dir_, this);
- notes.push (info.o_ - left);
- }
- Encompass_info info (encompass_arr_.top (), dir_, this);
- Real inter_staff = info.interstaff_f_;
-
- d[Y_AXIS] += inter_staff;
-
- // prebreak
- if (inter_staff && (encompass_arr_.top () != spanned_drul_[RIGHT]))
- {
- Encompass_info info (encompass_arr_[encompass_arr_.size () - 1], dir_, this);
- d[Y_AXIS] -= info.o_[Y_AXIS] - inter_staff;
+ if (i >= first)
+ notes.push (info.o_ - left);
+ else
+ dy = info.interstaff_f_;
}
+ notes[0][Y_AXIS] += dy;
notes.push (d);
-
+
return notes;
}
--- /dev/null
+/*
+ spacing-engraver.cc -- implement Spacing_engraver
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#include "engraver.hh"
+#include "pqueue.hh"
+#include "musical-request.hh"
+#include "score-column.hh"
+
+struct Rhythmic_tuple
+{
+ Score_element_info info_;
+ Moment end_;
+
+ Rhythmic_tuple ()
+ {
+ }
+ Rhythmic_tuple (Score_element_info i, Moment m )
+ {
+ info_ = i;
+ end_ = m;
+ }
+ static int time_compare (Rhythmic_tuple const &, Rhythmic_tuple const &);
+};
+
+inline int
+compare (Rhythmic_tuple const &a, Rhythmic_tuple const &b)
+{
+ return Rhythmic_tuple::time_compare (a,b);
+}
+
+int
+Rhythmic_tuple::time_compare (Rhythmic_tuple const&h1,
+ Rhythmic_tuple const &h2)
+{
+ return (h1.end_ - h2.end_ ).sign ();
+}
+
+/**
+ Acknowledge rhythmic elements, for initializing spacing fields in
+ the columns. */
+class Spacing_engraver : public Engraver
+{
+ PQueue<Rhythmic_tuple> playing_durations_;
+ Array<Rhythmic_tuple> now_durations_;
+ Array<Rhythmic_tuple> stopped_durations_;
+
+protected:
+ VIRTUAL_COPY_CONS(Translator);
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_post_move_processing ();
+ virtual void do_pre_move_processing ();
+
+public:
+
+};
+
+
+void
+Spacing_engraver::acknowledge_element (Score_element_info i)
+{
+ if (Rhythmic_req * r = dynamic_cast<Rhythmic_req*>(i.req_l_))
+ {
+ Rhythmic_tuple t(i, now_mom () + r->length_mom ());
+ now_durations_.push (t);
+ }
+}
+
+void
+Spacing_engraver::do_pre_move_processing ()
+{
+ Moment shortest_playing;
+ shortest_playing.set_infinite (1);
+ for (int i=0; i < playing_durations_.size (); i++)
+ {
+ Moment m = (playing_durations_[i].info_.req_l_)->length_mom ();
+ if (m)
+ shortest_playing = shortest_playing <? m;
+ }
+
+ Moment starter;
+ starter.set_infinite (1);
+ for (int i=0; i < now_durations_.size (); i++)
+ {
+ Moment m = now_durations_[i].info_.req_l_->length_mom ();
+ if (m)
+ starter = starter <? m;
+
+ playing_durations_.insert (now_durations_[i]);
+ }
+ now_durations_.clear ();
+
+ shortest_playing = shortest_playing <? starter;
+
+ Score_column * sc
+ = dynamic_cast<Score_column*> (get_staff_info ().musical_pcol_l ());
+
+ sc->shortest_playing_mom_ = shortest_playing;
+ sc->shortest_starter_mom_ = starter;
+}
+
+
+void
+Spacing_engraver::do_post_move_processing ()
+{
+ Moment now = now_mom ();
+ stopped_durations_.clear ();
+ while (playing_durations_.size () && playing_durations_.front ().end_ < now)
+ playing_durations_.delmin ();
+ while (playing_durations_.size () && playing_durations_.front ().end_ == now)
+ stopped_durations_.push (playing_durations_.get ());
+}
+
+ADD_THIS_TRANSLATOR(Spacing_engraver);
+
Union_find connected (cols_.size());
Array<int> fixed;
- for (Cons<Idealspacing> *i = ideal_p_list_; i; i = i->next_cons_p_)
+ for (Cons<Idealspacing> *i = ideal_p_list_; i; i = i->next_)
{
- connected.connect (i->car_p_->cols_drul_[LEFT],i->car_p_->cols_drul_[RIGHT]);
+ connected.connect (i->car_->cols_drul_[LEFT],i->car_->cols_drul_[RIGHT]);
}
for (int i = 0; i < cols_.size(); i++)
if (cols_[i].fixed_b())
return true;
}
-/** try to generate a solution which obeys the min distances and fixed positions
+/** try to generate a solution which obeys the min
+ distances and fixed positions
*/
Vector
Spring_spacer::try_initial_solution() const
lin.fill (0);
c = 0;
- for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_cons_p_)
+ for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_)
{
- Idealspacing *i = p->car_p_;
+ Idealspacing *i = p->car_;
int l = i->cols_drul_[LEFT];
int r = i->cols_drul_[RIGHT];
Spring_spacer::calculate_energy_f (Vector solution) const
{
Real e = 0.0;
- for (Cons<Idealspacing>*p =ideal_p_list_; p; p = p->next_cons_p_)
+ for (Cons<Idealspacing>*p =ideal_p_list_; p; p = p->next_)
{
- Idealspacing * i = p->car_p_;
+ Idealspacing * i = p->car_;
e += i->energy_f(solution(i->cols_drul_[RIGHT]) - solution(i->cols_drul_[LEFT]));
}
while (*pp)
{
- Idealspacing *j = (*pp)->car_p_;
+ Idealspacing *j = (*pp)->car_;
if (j->cols_drul_[LEFT] == idx|| j->cols_drul_[RIGHT] == idx)
{
- delete remove_cons_p (pp);
+ delete remove_cons (pp);
}
else
{
- pp = &(*pp)->next_cons_p_;
+ pp = &(*pp)->next_;
}
}
c.ugh_b_ = true;
cols_[i].print();
}
- for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_cons_p_)
+ for (Cons<Idealspacing> *p =ideal_p_list_; p; p = p->next_)
{
- p->car_p_->print();
+ p->car_->print();
}
#endif
}
ideal_p_list_ = new Killing_cons<Idealspacing> (s, ideal_p_list_);
}
-
-
-
void
Spring_spacer::prepare()
{
/**
get the shortest_playing running note at a time. */
void
-Spring_spacer::get_ruling_durations(Array<Moment> &shortest_playing_arr,
- Array<Moment> &context_shortest_arr)
+Spring_spacer::get_ruling_durations(Array<Moment> &context_shortest_arr)
{
for (int i=0; i < cols_.size(); i++)
{
for (int i=0; i < cols_.size(); i++)
{
Score_column * sc = scol_l(i);
- Moment now = scol_l (i)->when();
- Moment shortest_playing;
- shortest_playing.set_infinite (1);
- if (!sc->musical_b ())
+ if (sc->breakable_b () || sc->break_status_dir ())
{
for (int ji=i; ji >= start_context_i; ji--)
context_shortest_arr[ji] = context_shortest;
start_context_i = i;
context_shortest.set_infinite (1);
}
- if (sc->durations.size())
- {
- context_shortest = context_shortest <? sc->durations[0];
- }
-
- // ji was j, but triggered ICE
- for (int ji=i+1; ji --;)
- {
- if (scol_l(ji)->durations.size() &&
- now - scol_l(ji)->when() >= shortest_playing)
- break;
-
- for (int k = scol_l (ji)->durations.size();
- k-- && scol_l(ji)->durations[k] + scol_l(ji)->when() > now;
- )
- {
- shortest_playing = shortest_playing <? scol_l(ji)->durations[k];
- }
- }
- shortest_playing_arr.push(shortest_playing);
+ else if (sc->musical_b ())
+ context_shortest = context_shortest <? sc->shortest_starter_mom_;
}
#ifndef NPRINT
- DOUT << "shortest_playing/:[ ";
- for (int i=0; i < shortest_playing_arr.size(); i++)
+ DOUT << "context shortest :[ ";
+ for (int i=0; i < context_shortest_arr.size(); i++)
{
- DOUT << shortest_playing_arr[i] << " ";
DOUT << context_shortest_arr[i] << ", ";
}
DOUT << "]\n";
TODO: This needs rethinking.......
- * Spacing should take optical
- effects into account
+ * Spacing should take optical effects into account
- * Should be decentralised
+ * Should be decentralised
The algorithm is taken from :
void
Spring_spacer::calc_idealspacing()
{
- Array<Moment> shortest_playing_arr;
Array<Moment> context_shortest_arr;
- get_ruling_durations(shortest_playing_arr, context_shortest_arr);
+ get_ruling_durations(context_shortest_arr);
Real interline_f = paper_l ()->get_realvar (interline_scm_sym);
{
Real symbol_distance =cols_[i].width_[RIGHT] + 2 PT;
Real durational_distance = 0;
- Moment delta_t = scol_l (i+1)->when() - scol_l (i)->when () ;
+ Moment delta_t = scol_l (i+1)->when_mom () - scol_l (i)->when_mom () ;
/*
ugh should use shortest_playing distance
{
if (scol_l (i)->musical_b())
{
- Moment shortest_playing_len = shortest_playing_arr[i];
+ Moment shortest_playing_len = scol_l(i)->shortest_playing_mom_;
Moment context_shortest = context_shortest_arr[i];
if (! shortest_playing_len)
{
warning (_f ("can't find a ruling note at %s",
- scol_l (i)->when().str ()));
+ scol_l (i)->when_mom ().str ()));
shortest_playing_len = 1;
}
if (! context_shortest)
{
warning (_f ("no minimum in measure at %s",
- scol_l (i)->when().str ()));
+ scol_l (i)->when_mom ().str ()));
context_shortest = 1;
}
- Moment delta_t = scol_l (i+1)->when() - scol_l (i)->when ();
+ Moment delta_t = scol_l (i+1)->when_mom () - scol_l (i)->when_mom ();
Real k= paper_l()->arithmetic_constant(context_shortest);
Real dist = paper_l()->length_mom_to_dist (shortest_playing_len, k);
dist *= (double)(delta_t / shortest_playing_len);
void
Stem_engraver::acknowledge_element(Score_element_info i)
{
- if (dynamic_cast<Rhythmic_head *> (i.elem_l_))
+ if (Rhythmic_head * h = dynamic_cast<Rhythmic_head *> (i.elem_l_))
{
- Rhythmic_head *h = dynamic_cast<Rhythmic_head *> (i.elem_l_);
+ Rhythmic_req * r = dynamic_cast <Rhythmic_req *> (i.req_l_);
+ int duration_log = r->duration_.durlog_i_;
if (!stem_p_)
{
- Rhythmic_req * r = dynamic_cast <Rhythmic_req *> (i.req_l_);
stem_p_ = new Stem;
- int durlog_i = r->duration_.durlog_i_;
- stem_p_->flag_i_ = durlog_i;
+ stem_p_->flag_i_ = duration_log;
if (abbrev_req_l_)
{
{
abbrev_p_ = new Abbreviation;
announce_element (Score_element_info (abbrev_p_, abbrev_req_l_));
- abbrev_p_->abbrev_flags_i_ =intlog2 (t) - (durlog_i>? 2);
+ abbrev_p_->abbrev_flags_i_ =intlog2 (t) - (duration_log>? 2);
}
}
// must give the request, to preserve the rhythmic info.
announce_element (Score_element_info (stem_p_, r));
}
+
+ if (stem_p_->flag_i_ != duration_log)
+ {
+ r->warning (_f("Adding note head to incompatible stem (type = %d)", 1 << stem_p_->flag_i_));
+ }
+
stem_p_->add_head (h);
}
}
Stem_info::Stem_info ()
{
}
+/*
+ FIXME: y dims should not be in internote.
+ */
Stem_info::Stem_info (Stem*s, int mult)
{
x_ = stem_l_->hpos_f ();
dir_ = stem_l_->dir_;
SCM bd = stem_l_->remove_elt_property (beam_dir_scm_sym);
+
beam_dir_ = gh_scm2int (SCM_CDR(bd));
interstaff_f_ = 0;
// interstaff beam
Beam* beam_l = stem_l_->beam_l_;
+
Dimension_cache *common = stem_l_->common_group (beam_l, Y_AXIS);
Align_element * align = dynamic_cast<Align_element*> (common->element_l ());
if (align && align->axis() == Y_AXIS)
return dir_;
}
-void
-Stem::set_default_dir ()
-{
- dir_ = get_default_dir ();
-}
void
Stem::set_default_stemlen ()
Real shorten_f = paper_l ()->get_var ("forced_stem_shorten0") / internote_f;
if (!dir_)
- set_default_dir ();
+ dir_ = get_default_dir ();
+
/*
stems in unnatural (forced) direction should be shortened,
according to [Roush & Gourlay]
if (yextent_drul_[DOWN]== yextent_drul_[UP])
set_default_extents ();
set_noteheads ();
- flag_i_ = flag_i_;
+
if (invisible_b ())
{
set_elt_property (transparent_scm_sym, SCM_BOOL_T);
}
}
+
+ if (!tie_p_arr_.size ())
+ {
+ req_l_->warning (_("No ties were created!"));
+ }
+
}
}
}
/*
ugh: direction of the Tie is more complicated. See [Ross] p136 and further
*/
-void
-Tie::set_default_dir()
+Direction
+Tie::get_default_dir() const
{
int m= (head_l_drul_[LEFT]->position_i_
+ head_l_drul_[RIGHT]->position_i_) /2;
- dir_ = (m < 0)? DOWN : UP;
+ return(m < 0)? DOWN : UP;
}
void
--- /dev/null
+/*
+ time-scaled-music-iterator.cc -- implement Time_scaled_music_iterator
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#include "time-scaled-music-iterator.hh"
+#include "time-scaled-music.hh"
+#include "musical-request.hh"
+#include "translator-group.hh"
+#include "command-request.hh"
+
+
+
+void
+Time_scaled_music_iterator::do_process_and_next (Moment m)
+{
+ if (first_b_)
+ {
+ bool success = report_to_l ()->try_music (dynamic_cast<Time_scaled_music const*> (music_l_));
+ if (!success)
+ music_l_->warning ( _("No one to print a tuplet start bracket"));
+ }
+
+ Music_wrapper_iterator::do_process_and_next (m);
+}
--- /dev/null
+/*
+ time-scaled-music.cc -- implement Time_scaled_music
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+ */
+
+#include "time-scaled-music.hh"
+
+
+Time_scaled_music::Time_scaled_music (int n, int d,Music *mp)
+ : Music_wrapper (mp)
+{
+ num_i_ = n;
+ den_i_ = d;
+ compress (Moment (num_i_,den_i_));
+}
+
+
+
+
else
{
time_.set_time_signature (b_i, o_i);
+
default_grouping_ =
- Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)), b_i);
+ Rhythmic_grouping (MInterval (0,Moment (b_i, o_i)),
+ b_i == 1 ? 2 : b_i);
}
}
else if (Partial_measure_req *pm = dynamic_cast <Partial_measure_req *> (tr_l))
error ("Program has no such type");
if (add)
- consists_str_arr_.push (s);
+ {
+ for (int i=consists_str_arr_.size (); i--; )
+ if (consists_str_arr_[i] == s)
+ warning (_f("Already contains a `%s\'", s));
+
+ consists_str_arr_.push (s);
+ }
else
for (int i=consists_str_arr_.size (); i--; )
if (consists_str_arr_[i] == s)
bool
Translator_group::removable_b() const
{
- for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
+ for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
{
- if (dynamic_cast <Translator_group *> (p->car_p_))
+ if (dynamic_cast <Translator_group *> (p->car_))
return false;
}
Translator_group::group_l_arr () const
{
Link_array<Translator_group> groups;
- for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
+ for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
{
- if (dynamic_cast <Translator_group *> (p->car_p_))
- groups.push (dynamic_cast <Translator_group *> (p->car_p_));
+ if (dynamic_cast <Translator_group *> (p->car_))
+ groups.push (dynamic_cast <Translator_group *> (p->car_));
}
return groups;
}
Translator_group::nongroup_l_arr () const
{
Link_array<Translator> groups;
- for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
+ for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
{
- if (!dynamic_cast <Translator_group *> (p->car_p_))
- groups.push (p->car_p_);
+ if (!dynamic_cast <Translator_group *> (p->car_))
+ groups.push (p->car_);
}
return groups;
}
{
assert (trans_l);
- for (Cons<Translator> **pp = &trans_p_list_.head_cons_p_; *pp; pp = &(*pp)->next_cons_p_)
- if ((*pp)->car_p_ == trans_l)
+ for (Cons<Translator> **pp = &trans_p_list_.head_; *pp; pp = &(*pp)->next_)
+ if ((*pp)->car_ == trans_l)
{
- Cons<Translator> *r = trans_p_list_.remove_cons_p (pp);
- r->car_p_ =0;
+ Cons<Translator> *r = trans_p_list_.remove_cons (pp);
+ r->car_ =0;
trans_l->daddy_trans_l_ =0;
delete r;
return trans_l;
void
Translator_group::each (Method_pointer method)
{
- for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
- (p->car_p_->*method) ();
+ for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
+ (p->car_->*method) ();
}
void
Translator_group::each (Const_method_pointer method) const
{
- for (Cons<Translator> *p = trans_p_list_.head_cons_p_; p; p = p->next_cons_p_)
- (p->car_p_->*method) ();
+ for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
+ (p->car_->*method) ();
}
void
#include "command-request.hh"
#include "tuplet-spanner.hh"
#include "note-column.hh"
-#include "compressed-music.hh"
-
+#include "time-scaled-music.hh"
#include "beam.hh"
#include "music-list.hh"
bool
Tuplet_engraver::do_try_music (Music *r)
{
- if (Compressed_music * c = dynamic_cast<Compressed_music *> (r))
+ if (Time_scaled_music * c = dynamic_cast<Time_scaled_music *> (r))
{
Music *el = c->element_l ();
if (!dynamic_cast<Request_chord*> (el))
{
- compressed_music_arr_.push (c);
+ time_scaled_music_arr_.push (c);
stop_moments_.push (now_mom () + c->length_mom ());
}
return true;
Tuplet_engraver::do_process_requests ()
{
for (int i= started_span_p_arr_.size ();
- i < compressed_music_arr_.size (); i++)
+ i < time_scaled_music_arr_.size (); i++)
{
Tuplet_spanner* glep = new Tuplet_spanner;
started_span_p_arr_.push (glep);
- glep->number_str_ = to_str (compressed_music_arr_[i]->den_i_);
- announce_element (Score_element_info (glep, compressed_music_arr_ [i]));
+ glep->number_str_ = to_str (time_scaled_music_arr_[i]->den_i_);
+ announce_element (Score_element_info (glep, time_scaled_music_arr_ [i]));
}
}
else if (Beam *b = dynamic_cast<Beam *> (i.elem_l_))
{
for (int j = 0; j < started_span_p_arr_.size (); j++)
- started_span_p_arr_[j]->set_beam (b);
+ started_span_p_arr_[j]->add_beam (b);
}
}
typeset_element (started_span_p_arr_[i]);
started_span_p_arr_.del (i);
stop_moments_.del(i);
- compressed_music_arr_.del(i);
+ time_scaled_music_arr_.del(i);
}
}
}
(c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
*/
-/*
- todo: handle breaking elegantly.
- */
-#include "beam.hh"
+#include "beam.hh"
#include "box.hh"
#include "debug.hh"
#include "lookup.hh"
#include "paper-def.hh"
#include "tuplet-spanner.hh"
#include "stem.hh"
-
#include "note-column.hh"
Tuplet_spanner::Tuplet_spanner ()
{
- beam_l_ =0;
bracket_visibility_b_ = true;
num_visibility_b_ = true;
}
+/*
+ TODO. We should control the gap for lookup from here.
+ */
Molecule*
Tuplet_spanner::do_brew_molecule_p () const
{
Real ncw = column_arr_.top ()->extent (X_AXIS).length ();
Molecule num (lookup_l ()->text ("italic",
number_str_));
+ num.align_to (X_AXIS, CENTER);
+ num.translate_axis (dir_ * paper_l ()->get_realvar (interline_scm_sym), Y_AXIS);
- if (beam_l_ && !bracket_visibility_b_)
+ if (beam_l_arr_.size () == 1 && !bracket_visibility_b_)
{
- Directional_spanner* ds = dynamic_cast<Directional_spanner*>(beam_l_);
+ Beam *beam_l = beam_l_arr_[0];
+ Directional_spanner* ds = dynamic_cast<Directional_spanner*>(beam_l);
num.translate (ds->center ());
num.translate_axis (ncw, X_AXIS);
}
Real dy = column_arr_.top ()->extent (Y_AXIS) [dir_]
- column_arr_[0]->extent (Y_AXIS) [dir_];
Real w = extent (X_AXIS).length () + ncw;
-
+ // num.align_to (Y_AXIS, CENTER);
num.translate (Offset (w/2, dy/2));
mol_p->add_molecule (lookup_l ()->plet (dy, w, dir_));
}
if (num_visibility_b_)
- mol_p->add_molecule (num);
+ {
+ mol_p->add_molecule (num);
+ }
}
return mol_p;
}
if (column_arr_.size())
translate_axis (column_arr_[0]->extent (Y_AXIS)[dir_], Y_AXIS);
- if (!broken_b () && beam_l_
- && spanned_drul_[LEFT]->column_l () == beam_l_->spanned_drul_[LEFT]->column_l ()
- && spanned_drul_[RIGHT]->column_l () == beam_l_->spanned_drul_[RIGHT]->column_l ())
- bracket_visibility_b_ = false;
+ if (beam_l_arr_.size () == 1)
+ {
+ Beam * beam_l = beam_l_arr_[0];
+ if (!broken_b ()
+ && spanned_drul_[LEFT]->column_l () == beam_l->spanned_drul_[LEFT]->column_l ()
+ && spanned_drul_[RIGHT]->column_l () == beam_l->spanned_drul_[RIGHT]->column_l ())
+ bracket_visibility_b_ = false;
+ }
if (column_arr_.size () == 1)
bracket_visibility_b_ = false;
{
if (Note_column *onc = dynamic_cast <Note_column *> (o))
column_arr_.substitute (onc, dynamic_cast<Note_column*> (n));
- else if (o == beam_l_)
+ else if (Beam * b = dynamic_cast<Beam* > (o))
{
- beam_l_ = dynamic_cast<Beam*> (n);
+ beam_l_arr_.substitute (b, dynamic_cast<Beam*> (n));
}
}
-void
-Tuplet_spanner::set_default_dir ()
+Direction
+Tuplet_spanner::get_default_dir () const
{
- dir_ = UP;
+ Direction d = UP;
for (int i=0; i < column_arr_.size (); i ++)
{
if (column_arr_[i]->dir () < 0)
{
- dir_ = DOWN;
+ d = DOWN;
break;
}
}
+ return d;
}
void
-Tuplet_spanner::set_beam (Beam *b)
+Tuplet_spanner::add_beam (Beam *b)
{
- assert(!beam_l_);
- beam_l_ = b;
add_dependency (b);
+ beam_l_arr_.push (b);
}
void
column_arr_[0]->extent (Y_AXIS) [UP];
dy += 2 * h;
- /*
- UGH. Must use extent ()[dir_]
- */
for (int i = 0; i < note_column_arr_.size (); i++)
- dy = dy >? note_column_arr_[i]->extent (Y_AXIS).max ();
+ dy = dy >? note_column_arr_[i]->extent (Y_AXIS)[BIGGER];
dy -= h;
Molecule two (lookup_l ()->text ("number", "2"));
A Dynamic Programming type of algorithm
similar to TeX's is in Gourlay_breaking
+
+ UGH. Should think about pre/post break columns.
*/
Array<Column_x_positions>
-Word_wrap::do_solve() const
+Word_wrap::do_solve () const
{
- problem_OK();
+ problem_OK ();
Line_of_cols &allcols (pscore_l_->col_l_arr_);
int curcol_idx = 0;
Array<Column_x_positions> breaking;
- Line_of_cols breakpoints (find_breaks());
- assert (breakpoints.size()>=2);
+ Line_of_cols breakpoints (find_breaks ());
+ assert (breakpoints.size ()>=2);
int break_idx=0;
int line_no = 0;
- while (break_idx < breakpoints.size() -1)
+ while (break_idx < breakpoints.size () -1)
{
Column_x_positions minimum;
Column_x_positions current;
// do another line
line_no ++;
- Paper_column *post = breakpoints[break_idx]->postbreak_l();
+ Item *post = breakpoints[break_idx]->find_prebroken_piece (RIGHT);
+ Paper_column *postcol =dynamic_cast<Paper_column*>(post);
+
int start_break_idx = break_idx;
- current.add_paper_column (post);
+ current.add_paper_column (postcol);
curcol_idx++; // skip the breakable.
break_idx++;
- while (break_idx < breakpoints.size())
+ while (break_idx < breakpoints.size ())
{
// add another measure.
while (breakpoints[break_idx] != allcols[curcol_idx])
current.add_paper_column (allcols[curcol_idx]);
curcol_idx++;
}
-
- current.add_paper_column (breakpoints[break_idx]->prebreak_l());
+
+ Item * pre = breakpoints[break_idx]->find_prebroken_piece (LEFT);
+ Paper_column* precol = dynamic_cast<Paper_column*>(pre);
+ current.add_paper_column (precol);
current.spacer_l_ = generate_spacing_problem (current.cols,
pscore_l_->paper_l_->line_dimensions_int (line_no));
// try to solve
if (!feasible (current.cols))
{
- if (!minimum.cols.size())
+ if (!minimum.cols.size ())
{
warning (_ ("ugh, this measure is too long")
+ ", " + _f ("breakpoint: %d", break_idx)
+ "(" + _ ("generating stupido solution") + ")");
- current.stupid_solution();
+ current.stupid_solution ();
current.energy_f_ = - 1; // make sure we break out.
}
else
}
else
{
- current.solve_line();
- current.print();
+ current.solve_line ();
+ current.print ();
}
delete current.spacer_l_;
// add nobreak version of breakable column
- current.cols.top()=breakpoints[break_idx];
+ current.cols.top ()=breakpoints[break_idx];
curcol_idx ++;
break_idx++;
}
return breaking;
}
-Word_wrap::Word_wrap()
+Word_wrap::Word_wrap ()
{
get_line_spacer = Spring_spacer::constructor;
}
\consists "Span_score_bar_engraver";
\consists "Score_priority_engraver";
+ \consists "Spacing_engraver";
\consists "Vertical_align_engraver";
alignmentReference = \down;
defaultClef = treble;
staffline = \interline / 10.0;
beam_thickness = 0.52 * (\interline - \staffline);
-interbeam = (2.0 * \interline - \beam_thickness) / 2.0;
+interbeam = (2.0 * \interline + \staffline - \beam_thickness) / 2.0;
interbeam4 = (3.0 * \interline - \beam_thickness) / 3.0;
% stems and beams
% Multi-measure rests
mmrest_x_minimum = 2.0*\staffheight;
+% in internote.
+restcollision_minimum_dist = 3.0;
+restcollision_minimum_beamdist = 1.5;
+
+postBreakPadding = 1.0*\interline;
+
\include "engraver.ly";
\shifton
}
-onestaff = {
+onestaff =
\translator Staff=one
-}
+
staffone = {
\translator Staff=one
traditional=2
infinity=10000
-beamslopeproportional = {
+beamslopeproportional =
\property Score.beamslopedamping = \none
-}
-beamslopedamped = {
+beamslopedamped =
\property Score.beamslopedamping = \normal
-}
-beamslopezero = {
+
+beamslopezero =
\property Score.beamslopedamping = \infinity
-}
+
% this sucks, you'd want to pass an array, at least
% (or embedded code: you still can't dictate the slope / stemlength)
-beamposfree = {
+beamposfree =
\property Score.beamquantisation = \none
-}
-beamposnormal = {
+
+beamposnormal =
\property Score.beamquantisation = \normal
-}
-beampostraditional = {
+
+beampostraditional =
\property Score.beamquantisation = \traditional
-}
-slurnormal = {
- \property Voice.slurdash = 0
-}
-slurdotted = {
+slurnormal =
+ \property Voice.slurdash = ""
+
+
+slurdotted =
\property Voice.slurdash = 1
-}
+
%{
for grace note hack, see input/test/grace.ly
$(outdir)/%.latex: %.doc
- $(PYTHON) $(depth)/scripts/mudela-book.py --outdir=$(outdir)/ --outname=$(notdir $(basename $@)) $<
+ $(PYTHON) $(depth)/scripts/mudela-book.py -I $(depth)/input/test/ --outdir=$(outdir)/ --dependencies --outname=$(notdir $(basename $@)) $<
Begin3
Titel: LilyPond
-Versie: 1.1.38
-Inschrijf datum: 06APR99
+Versie: 1.1.39
+Inschrijf datum: 12APR99
Beschrijving: @FLAPTEKST@
Trefwoorden: muziek typezetten midi notatie
Auteur: hanwen@stack.nl (Han-Wen Nienhuys)
janneke@gnu.org (Jan Nieuwenhuizen)
Onderhouden door: hanwen@cs.ruu.nl (Han-Wen Nienhuys)
Voornaamste plek: sunsite.unc.edu /pub/Linux/apps
- 770k lilypond-1.1.38.tar.gz
+ 770k lilypond-1.1.39.tar.gz
Oorspronkelijke plek: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 770k lilypond-1.1.38.tar.gz
+ 770k lilypond-1.1.39.tar.gz
Copi-eer voorwaarden: GPL
End
Begin3
Title: LilyPond
-Version: 1.1.38
-Entered-date: 06APR99
+Version: 1.1.39
+Entered-date: 12APR99
Description:
LilyPond is the GNU Project music typesetter. This program can print
beautiful sheet music from a music definition file. It can also play
janneke@gnu.org (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
- 770k lilypond-1.1.38.tar.gz
+ 770k lilypond-1.1.39.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 770k lilypond-1.1.38.tar.gz
+ 770k lilypond-1.1.39.tar.gz
Copying-policy: GPL
End
Name: lilypond
-Version: 1.1.38
+Version: 1.1.39
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.38.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.1.39.tar.gz
Summary: A program for printing sheet music.
URL: http://www.cs.uu.nl/~hanwen/lilypond
Packager: Han-Wen Nienhuys <hanwen@cs.uu.nl>
SCRIPTS = configure aclocal.m4
README_FILES = BUGS DEDICATION ANNOUNCE-0.1 ANNOUNCEMENT-1.0 \
- COPYING NEWS-0.1 NEWS-1.0 NEWS-0.0 NEWS TODO
+ COPYING NEWS-0.1 NEWS-1.0 NEWS-0.0 NEWS TODO AIMS
README_TXT_FILES = README.txt AUTHORS.txt INSTALL.txt PATCHES.txt
IN_FILES := $(wildcard *.in)
EXTRA_DIST_FILES = dstreamrc mudela-mode.el vimrc VERSION $(README_FILES) $(SCRIPTS) $(IN_FILES)
set_char_box (5/2 ledgerlinethickness#, 5/2 ledgerlinethickness#,
ledgerlinethickness#/2,ledgerlinethickness#/2);
pickup pencircle scaled ledgerlinethickness;
- lft x1 = -b;
+ lft x1 = -b ;
rt x2 = w;
y1 =0; y2 =0;
draw z1 .. z2;
-% feta-eindelijk.mf -- implement rest symbols
+% feta-eindelijk.mf -- implement rest symbols -*-Fundamental-*-
%
% part of LilyPond's pretty-but-neat music font
%
fet_endchar;
fet_beginchar("Quarter rest","2","quartrest");
- save alpha;
+% draw_staff (-2, 2, 0.0);
+ save alpha, yshift, height;
alpha:=-50;
+ yshift# = -1.25 interline#;
+ height# = 2.8125 interline#;
+ define_pixels (yshift, height);
+
+
+ set_char_box(0, 27/25interline#,
+ -yshift#,
+ yshift# + height#);
+
save ne,nw,se,sw; pair ne,nw,se,sw;
+
se=dir alpha; nw=dir (alpha+180);
ne=dir (alpha+90); sw=dir (alpha-90);
penpos1(rthin,alpha+90);
% z13=z2r+1/2rthin*ne;
z13=z2r+1/2rthin*ne+1/2rthin*nw;
- y1l=7/2interline; x1l=1/3interline;
+ y1r = h;
+ x1l=1/3interline;
z2r=z1+interline*se;
z3=1/2[z2,z4];
- x4=3/8interline; y4=2interline;
+ x4=3/8interline;
+ y4= 0;
z5=z4l+1.3interline*se;
- x6l=x4l; y6l=y4r;
- x7=2/5interline; y7=3/4interline;
+ x6l=x4l;
+ y6l=y4r;
+ x7=2/5interline;
+ y7= -d;
+
fill z1l{se}..{se}z10..z3l..z11{se}..{se}z5l..z5r{nw}..{nw}z12..z3r..z13{nw}..{nw}z1r.. cycle;
fill z5r{nw}..tension1.4..z6l..tension1.4..{se}z7l..z7r{nw}..tension1.4..z6r..tension1.4..{se}z5l..cycle;
penlabels(1,2,3,4,5,6,7);
penlabels(10,11,12,13);
- set_char_box(0, 27/25interline#, -3/4 interline#, 18/5interline#);
+
+% 3/4 interline# + yshift#,
+% 18/5interline# + yshift#)
+
fet_endchar;
def rest_crook(expr a, w) =
enddef;
fet_beginchar("8th rest","3","eighthrest");
- set_char_box(0, 4/3interline#,-interline#, 8/3interline#+7/4stafflinethickness#);
- save x,y, ht;
- ht = h + d;
- x1=w-stem/6; y1=ht-flare/4;
+% draw_staff (-2, 2, 0.0);
+ save yshift, ballcorrection;
+ ballcorrection = 0.005 interline;
+
+ yshift# := -1.0 interline#;
+ define_pixels(yshift);
+
+
+ set_char_box(0, 4/3interline#, -yshift#, yshift# +
+ 5/3interline#+7/4stafflinethickness#);
+
+ %
+ % The curve is like a valley causing less space between
+ % the curve and the lower staff line. Correct for this.
+ %
+ save x,y;
+
+ x1=w-stem/6;
+
+ y1 = yshift + 1.5 interline + flare/4 + ballcorrection;
rest_crook (z1,w-stem/6);
z2-z1=whatever*dir70;
- y2=stem/2;
+ y2= yshift + stem/2;
brush(z1,2/3stem,z2,stem);
- % ugh
- currentpicture:=currentpicture shifted (0,interline);
+
fet_endchar;
fet_beginchar("16th rest","4","sixteenthrest");
- save alpha,cw,h,w;
+% draw_staff (-2, 2, 0.0);
+ save yshift, ballcorrection;
+ ballcorrection = 0.005 interline;
+
+ yshift# := - 2 interline#;
+ define_pixels(yshift);
+
+ save alpha,cw,h,w, height;
alpha=74;
cw#=7/6interline#;
-% h#=5/3interline#+interline#+2stafflinethickness#;
- h#=5/3interline#+interline#+7/4stafflinethickness#;
- w#=cw#+(h#-3/2interline#)/tand(alpha);
- set_char_box(0,w#,0,h#);
+ height# = 5/3interline#+interline#+7/4stafflinethickness#;
+ set_char_box(0, cw#+(height#-3/2interline#)/tand(alpha),
+ -yshift#, height# + yshift#);
+
define_pixels(cw);
save x,y;
- x1=w-stem/6; y1=h-flare/4;
+ x1=w-stem/6;
+ y1 = yshift + 2.5 interline + flare/4 + ballcorrection;
+
z2-z1=whatever*dir alpha;
- y2=stem/2;
+ y2= yshift + stem/2;
brush(z1,2/3stem,z2,stem);
rest_crook (z1,cw);
z3-z1=whatever*dir alpha;
fet_endchar;
fet_beginchar("32th rest","5","thirtysecondrest");
- save alpha,cw,h,w;
+% draw_staff (-2, 2, 0.0);
+ save yshift, ballcorrection;
+ ballcorrection = 0.005 interline;
+
+ yshift# := -2 interline#;
+ define_pixels(yshift);
+
+ save alpha,cw,h;
alpha=76;
cw#=7/6interline#;
h#=5/3interline#+2interline#+7/4stafflinethickness#;
- w#=cw#+(h#-3/2interline#)/tand(alpha);
- set_char_box(0,w#,0,h#);
+
+ set_char_box(0, cw#+(h#-3/2interline#)/tand(alpha),
+ -yshift#,yshift# +h#);
define_pixels(cw);
save x,y;
- x1=w-stem/6; y1=h-flare/4;
+ x1=w-stem/6;
+ y1 = yshift + 3.5 interline + flare/4 + ballcorrection;
+
z2-z1=whatever*dir alpha;
- y2=stem/2;
+ y2=stem/2 + yshift;
brush(z1,2/3stem,z2,stem);
rest_crook (z1,cw);
z3-z1=whatever*dir alpha;
fet_endchar;
fet_beginchar("64th rest","6","sixtyfourthrest");
+% draw_staff (-2, 2, 0.0);
+ save yshift, ballcorrection;
+ ballcorrection = 0.005 interline;
+
+ yshift# := -3 interline#;
+ define_pixels(yshift);
+
save alpha,cw,h,w;
alpha=78;
cw#=7/6interline#;
h#=5/3interline#+3interline#+7/4stafflinethickness#;
w#=cw#+(h#-3/2interline#)/tand(alpha);
- set_char_box(0,w#,0,h#);
+ set_char_box(0,w#,-yshift# ,yshift# + h#);
+
define_pixels(cw);
save x,y;
- x1=w-stem/6; y1=h-flare/4;
+ x1=w-stem/6;
+
+ y1 = yshift + 4.5 interline + flare/4 + ballcorrection;
+
z2-z1=whatever*dir alpha;
- y2=stem/2;
+ y2=stem/2 + yshift;
brush (z1,2/3stem,z2,stem);
rest_crook (z1,cw);
z3-z1=whatever*dir alpha;
z5-z1=whatever*dir alpha;
y5=y1-3interline;
rest_crook (z5,cw);
- % ugh
- currentpicture:=currentpicture shifted (0,-interline);
+
fet_endchar;
fet_beginchar("128th rest","7","hundredtwentyeighthrest");
+% draw_staff (-2, 2, 0.0);
+ save yshift, ballcorrection;
+ ballcorrection = 0.005 interline;
+
+ yshift# := -3 interline#;
+ define_pixels(yshift);
save alpha,cw,h,w;
alpha=78;
cw#=7/6interline#;
h#=5/3interline#+4interline#+7/4stafflinethickness#;
w#=cw#+(h#-3/2interline#)/tand(alpha);
- set_char_box(0,w#,0,h#);
+ set_char_box(0,w#, -yshift#,yshift# + h#);
define_pixels(cw);
save x,y;
- x1=w-stem/6; y1=h-flare/4;
+ x1=w-stem/6;
+ y1 = yshift + 5.5 interline + flare/4 + ballcorrection;
+
z2-z1=whatever*dir alpha;
- y2=stem/2;
+ y2=stem/2 + yshift;
brush (z1,2/3stem,z2,stem);
rest_crook (z1,cw);
z3-z1=whatever*dir alpha;
z6-z1=whatever*dir alpha;
y6=y1-4interline;
rest_crook (z6,cw);
- % ugh
- currentpicture:=currentpicture shifted (0,-interline);
+
fet_endchar;
endgroup;
-i%
-% feta-generic.mf -- implement
%
+% feta-generic.mf -- implement generic stuff: include lots of files, but don't
+% set dims.
+%
% source file of the Feta (defintively not an abbreviation for Font-En-Tja)
% music font
%
-% feta-klef.mf -- implement Clefs
+% feta-klef.mf -- implement Clefs -*-Fundamental-*-
%
% part of LilyPond's pretty-but-neat music font
%
right_space# = reduced_il#;
enddef;
-def draw_staff(expr first, last)=
- pickup pencircle scaled stafflinethickness;
- for i:= first step 1 until last:
- draw (- interline, i* interline) .. (4 interline, i* interline);
- endfor
- enddef;
% [Wanske] says the bulbs should be positioned about 1/4 right of the
% "arrow"
enddef;
+def draw_staff(expr first, last, offset)=
+ pickup pencircle scaled stafflinethickness;
+ for i:= first step 1 until last:
+ draw (- interline, (i + offset) * interline) .. (4 interline,( i+ offset)* interline);
+ endfor
+ enddef;
+
+
%
% Transforms
%
enddef;
%
-%
+% Draw a (rest) crook, starting at thickness STEM in point A,
+% ending a ball W to the left, diameter BALLDIAM
+% ypart of the center of the ball is BALLDIAM/4 lower than ypart A
%
def balled_crook(expr a, w, balldiam, stem) =
begingroup;
#define MIDI_TRACK_PARSER_HH
#include "proto.hh"
-#include "cons.hh"
+#include "plist.hh"
#include "moment.hh"
#include "mi2mu-proto.hh"
#include "midi-parser.hh"
Moment at_mom_;
Byte running_byte_;
- Cons_list<Mudela_note> open_note_l_list_;
+ Link_list<Mudela_note*> open_note_l_list_;
Mudela_staff* mudela_staff_p_;
Midi_parser_info* track_info_p_;
};
#include "proto.hh"
#include "mi2mu-proto.hh"
#include "moment.hh"
-#include "cons.hh"
+#include "plist.hh"
/// (mudela_column)
class Mudela_column
Mudela_column (Mudela_score* mudela_score_l, Moment mom);
void add_item (Mudela_item* mudela_item_l);
- Moment at_mom ();
+ Moment at_mom();
- Cons_list<Mudela_item> mudela_item_l_list_;
+ Link_list<Mudela_item*> mudela_item_l_list_;
Moment at_mom_;
Mudela_score* mudela_score_l_;
};
class Mudela_item
{
public:
- Mudela_item (Mudela_column* mudela_column_l);
- virtual ~Mudela_item ();
+ Mudela_item (Mudela_column* mudela_column_l);
+ virtual ~Mudela_item ();
- virtual Moment at_mom ();
- virtual Moment duration_mom ();
- void output (Mudela_stream& mudela_stream_r);
- virtual String str () = 0;
+ virtual Moment at_mom();
+ virtual Moment duration_mom();
+ void output (Mudela_stream& mudela_stream_r);
+ virtual String str() = 0;
- Mudela_column* mudela_column_l_;
+ Mudela_column* mudela_column_l_;
};
class Mudela_key : public Mudela_item
{
public:
- Mudela_key (int accidentals_i, int minor_i);
+ Mudela_key (int accidentals_i, int minor_i);
- String notename_str (int pitch_i);
- virtual String str ();
+ String notename_str (int pitch_i);
+ virtual String str();
- //private:
- int accidentals_i_;
- int minor_i_;
+//private:
+ int accidentals_i_;
+ int minor_i_;
};
class Mudela_time_signature : public Mudela_item
{
public:
- Mudela_time_signature (int num_i, int den_i, int division_4_i, int count_32_i);
+ Mudela_time_signature (int num_i, int den_i, int division_4_i, int count_32_i);
- Duration i2_dur (int time_i, int division_1_i);
- int clocks_1_i ();
- int den_i ();
- int num_i ();
- virtual String str ();
- Moment bar_mom ();
+ Duration i2_dur (int time_i, int division_1_i);
+ int clocks_1_i();
+ int den_i();
+ int num_i();
+ virtual String str();
+ Moment bar_mom();
private:
- Real sync_f_;
- Duration sync_dur_;
- int clocks_1_i_;
- int num_i_;
- int den_i_;
+ Real sync_f_;
+ Duration sync_dur_;
+ int clocks_1_i_;
+ int num_i_;
+ int den_i_;
};
class Mudela_note : public Mudela_item
{
public:
- Mudela_note (Mudela_column* mudela_column_l, int channel_i, int pitch_i, int dyn_i);
+ Mudela_note (Mudela_column* mudela_column_l, int channel_i, int pitch_i, int dyn_i);
- Duration duration ();
- virtual Moment duration_mom ();
- virtual String str ();
+ Duration duration();
+ virtual Moment duration_mom();
+ virtual String str();
- // int const c0_pitch_i_c_ = 60; // huh?
- static int const c0_pitch_i_c_ = 48;
+// int const c0_pitch_i_c_ = 60; // huh?
+ static int const c0_pitch_i_c_ = 48;
- static bool const simple_plet_b_s = false;
- int channel_i_;
- int pitch_i_;
- Mudela_column* end_column_l_;
+ static bool const simple_plet_b_s = false;
+ int channel_i_;
+ int pitch_i_;
+ Mudela_column* end_column_l_;
};
class Mudela_skip : public Mudela_item
{
public:
- Mudela_skip (Mudela_column* mudela_column_l, Moment skip_mom);
+ Mudela_skip (Mudela_column* mudela_column_l, Moment skip_mom);
- Duration duration ();
- virtual Moment duration_mom ();
- virtual String str ();
+ Duration duration();
+ virtual Moment duration_mom();
+ virtual String str();
private:
- Moment mom_;
+ Moment mom_;
};
class Mudela_tempo : public Mudela_item
{
public:
- Mudela_tempo (int useconds_per_4_i);
+ Mudela_tempo (int useconds_per_4_i);
- int get_tempo_i (Moment moment);
- virtual String str ();
- int useconds_per_4_i ();
+ int get_tempo_i (Moment moment);
+ virtual String str();
+ int useconds_per_4_i();
private:
- int useconds_per_4_i_;
- Moment seconds_per_1_mom_;
+ int useconds_per_4_i_;
+ Moment seconds_per_1_mom_;
};
class Mudela_text : public Mudela_item
{
public:
- enum Type {
- TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC,
- MARKER, CUE_POINT
- };
- Mudela_text (Mudela_text::Type type, String str);
- virtual String str ();
-
- //private:
- Type type_;
- String text_str_;
+ enum Type {
+ TEXT = 1, COPYRIGHT, TRACK_NAME, INSTRUMENT_NAME, LYRIC,
+ MARKER, CUE_POINT
+ };
+ Mudela_text (Mudela_text::Type type, String str);
+ virtual String str();
+
+//private:
+ Type type_;
+ String text_str_;
};
#endif // MUDELA_ITEM_HH
#include "mi2mu-proto.hh"
#include "proto.hh"
-#include "cons.hh"
+#include "plist.hh"
#include "parray.hh"
/// (mudela_score)
class Mudela_score {
public:
- Mudela_score (int format_i, int tracks_i, int tempo_i);
- ~Mudela_score ();
+ Mudela_score (int format_i, int tracks_i, int tempo_i);
+ ~Mudela_score();
- void add_item (Mudela_item* mudela_item_p);
- void add_staff (Mudela_staff* mudela_staff_p);
+ void add_item (Mudela_item* mudela_item_p);
+ void add_staff (Mudela_staff* mudela_staff_p);
- Mudela_column* find_column_l (Moment mom);
- Mudela_column* get_column_l (Moment mom);
+ Mudela_column* find_column_l (Moment mom);
+ Mudela_column* get_column_l (Moment mom);
- void output (String filename_str);
- void process ();
+ void output (String filename_str);
+ void process();
- // ugh
- Mudela_key* mudela_key_l_;
- Mudela_time_signature* mudela_time_signature_l_;
- Mudela_tempo* mudela_tempo_l_;
+ // ugh
+ Mudela_key* mudela_key_l_;
+ Mudela_time_signature* mudela_time_signature_l_;
+ Mudela_tempo* mudela_tempo_l_;
private:
- void filter_tempo ();
- void quantify_columns ();
- void quantify_durations ();
- void settle_columns ();
+ void filter_tempo();
+ void quantify_columns();
+ void quantify_durations();
+ void settle_columns();
- Cons_list<Mudela_staff> mudela_staff_p_list_;
- Link_array<Mudela_column> column_l_array_;
+ Pointer_list<Mudela_staff*> mudela_staff_p_list_;
+ // wants Pointer_array!
+// Pointer_list<Mudela_column*> mudela_column_p_list_;
+ Link_array<Mudela_column> column_l_array_;
- // ugh, ugh, ugh
+// ugh, ugh, ugh
public:
- int format_i_;
- int tracks_i_;
- int tempo_i_;
+ int format_i_;
+ int tracks_i_;
+ int tempo_i_;
};
#endif // MUDELA_SCORE_HH
#include "mi2mu-proto.hh"
#include "proto.hh"
-#include "cons.hh"
+#include "plist.hh"
#include "string.hh"
/// (mudela_staff)
-class Mudela_staff
-{
+class Mudela_staff {
public:
Mudela_staff (int number_i, String copyright_str, String track_name_str, String instrument_str);
void add_item (Mudela_item* mudela_item_p);
- void eat_voice (Cons_list<Mudela_item>& items);
- String id_str ();
- String name_str ();
+ void eat_voice (Link_list<Mudela_item*>& items);
+ String id_str();
+ String name_str();
void output (Mudela_stream& mudela_stream_r);
- void process ();
+ void process();
String copyright_str_;
String instrument_str_;
private:
void output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment now_mom, int bar_i);
- Cons_list<Mudela_voice> mudela_voice_p_list_;
- Cons_list<Mudela_item> mudela_item_p_list_;
+ Pointer_list<Mudela_voice*> mudela_voice_p_list_;
+ Pointer_list<Mudela_item*> mudela_item_p_list_;
};
#endif // MUDELA_STAFF_HH
#define MUDELA_VOICE_HH
#include "mi2mu-proto.hh"
-#include "cons.hh"
+#include "plist.hh"
/// (mudela_voice)
-class Mudela_voice
-{
+class Mudela_voice {
public:
- Mudela_voice (Mudela_staff* mudela_staff_l);
+ Mudela_voice (Mudela_staff* mudela_staff_l);
- void add_item (Mudela_item* mudela_item_l);
- Moment begin_mom ();
- Moment end_mom ();
+ void add_item (Mudela_item* mudela_item_l);
+ Moment begin_mom();
+ Moment end_mom();
- void output (Mudela_stream& mudela_stream_r);
+ void output (Mudela_stream& mudela_stream_r);
private:
- Mudela_staff* mudela_staff_l_;
- Cons_list<Mudela_item> mudela_item_l_list_;
+ Mudela_staff* mudela_staff_l_;
+ Link_list<Mudela_item*> mudela_item_l_list_;
};
#endif // MUDELA_VOICE_HH
assert (col_l);
- for (Cons<Mudela_note>** pp = &open_note_l_list_.head_cons_p_; *pp;)
+ for (PCursor<Mudela_note*> i (open_note_l_list_.top ()); i.ok (); )
{
- Cons<Mudela_note>* i = *pp;
- if ((i->car_p_->pitch_i_ == pitch_i) && (i->car_p_->channel_i_ == channel_i))
+ if ((i->pitch_i_ == pitch_i) && (i->channel_i_ == channel_i))
{
- i->car_p_->end_column_l_ = col_l;
- delete open_note_l_list_.remove_cons_p (pp);
+ i->end_column_l_ = col_l;
+ // LOGOUT(DEBUG_ver) << "Note: " << pitch_i;
+ // LOGOUT(DEBUG_ver) << "; " << i->mudela_column_l_->at_mom_;
+ // LOGOUT(DEBUG_ver) << ", " << i->end_column_l_->at_mom_ << '\n';
+ i.remove_p();
return;
}
else
- pp = &i->next_cons_p_;
+ i++;
}
warning (_f ("junking note-end event: channel = %d, pitch = %d",
channel_i, pitch_i));
{
// find
assert (col_l);
- for (Cons<Mudela_note>* i = open_note_l_list_.head_cons_p_; i; i = i->next_cons_p_)
+ for (PCursor<Mudela_note*> i (open_note_l_list_.top ()); i.ok (); )
{
- i->car_p_->end_column_l_ = col_l;
+ i->end_column_l_ = col_l;
+ i.remove_p ();
}
- open_note_l_list_.init ();
}
Mudela_staff*
{
Mudela_note* p = new Mudela_note (col_l, channel_i, pitch_i, dyn_i);
item_p = p;
- open_note_l_list_.append (new Cons<Mudela_note> (p, 0));
+ open_note_l_list_.bottom ().add (p);
}
else
{
note_end (col_l, channel_i, pitch_i, dyn_i);
}
}
-
// POLYPHONIC_AFTERTOUCH [\xa0-\xaf]
else if ((byte >= 0xa0) && (byte <= 0xaf))
{
void
Mudela_column::add_item (Mudela_item* mudela_item_l)
{
- mudela_item_l_list_.append (new Cons<Mudela_item> (mudela_item_l, 0));
+ mudela_item_l_list_.bottom().add (mudela_item_l);
}
Moment
#include "mudela-staff.hh"
#include "mudela-stream.hh"
-#include "killing-cons.tcc"
+// ugh, cygnus' b19 gcc
+#include "list.tcc"
+#include "cursor.tcc"
//static Mudela_key key_c (0, 0);
static Mudela_time_signature time_sig_4 (4, 2, 24, 8);
mudela_tempo_l_ = &tempo_60;
}
-Mudela_score::~Mudela_score ()
+Mudela_score::~Mudela_score()
{
}
void
Mudela_score::add_item (Mudela_item* mudela_item_p)
{
- mudela_staff_p_list_.tail_car_l ()->add_item (mudela_item_p);
+ mudela_staff_p_list_.bottom()->add_item (mudela_item_p);
}
void
Mudela_score::add_staff (Mudela_staff* mudela_staff_p)
{
- mudela_staff_p_list_.append (new Killing_cons<Mudela_staff> (mudela_staff_p, 0));
+ mudela_staff_p_list_.bottom().add (mudela_staff_p);
}
Mudela_column*
Mudela_score::find_column_l (Moment mom)
{
+#if 0
+ // should do binary search
+ for (int i = 0; i < column_l_array_.size (); i++ )
+ if ( column_l_array_[i]->at_mom () == mom )
+ return column_l_array_[i];
+ return 0;
+#else
int upper_i = max (0, column_l_array_.size () - 1);
int lower_i = 0;
int i = 0; //upper_i;
upper_i = i;
else
lower_i = i;
- if ( (upper_i == lower_i) || (i == column_l_array_.size () - 1))
+ if ((upper_i == lower_i) || (i == column_l_array_.size () - 1))
{
// we don't do inserts
assert (0);
}
assert (0);
return 0;
+#endif
}
Mudela_column*
{
int i;
Mudela_column *c=0;
- for (i=column_l_array_.size () - 1; !c && i >=0; i--)
+ for (i=column_l_array_.size() - 1; !c && i >=0; i--)
{
if (column_l_array_ [i]->at_mom () == mom )
c = column_l_array_[i];
void
Mudela_score::output (String filename_str)
{
- LOGOUT (NORMAL_ver) << _f ("Lily output to %s...", filename_str) << endl;
+ LOGOUT(NORMAL_ver) << _f ("Lily output to %s...", filename_str) << endl;
// ugh, ugly midi type 1 fix
- if ( (mudela_staff_p_list_.size_i () == 1)
- && !mudela_staff_p_list_.car_l ()->number_i_)
- mudela_staff_p_list_.car_l ()->number_i_ = 1;
+ if ( (mudela_staff_p_list_.size() == 1) && !mudela_staff_p_list_.top()->number_i_)
+ mudela_staff_p_list_.top()->number_i_ = 1;
int track_i = 0;
Mudela_stream mudela_stream (filename_str);
- for (Cons<Mudela_staff>* i = mudela_staff_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+ for (PCursor<Mudela_staff*> i (mudela_staff_p_list_); i.ok(); i++)
{
- LOGOUT (NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
- i->car_p_->output (mudela_stream);
+ LOGOUT(NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
+ i->output (mudela_stream);
mudela_stream << '\n';
- LOGOUT (NORMAL_ver) << endl;
+ LOGOUT(NORMAL_ver) << endl;
}
mudela_stream << "\\score{\n";
- if (mudela_staff_p_list_.size_i () > 1)
+ if (mudela_staff_p_list_.size() > 1)
mudela_stream << "< \n";
- for (Cons<Mudela_staff>* i = mudela_staff_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+ for (PCursor<Mudela_staff*> i (mudela_staff_p_list_); i.ok(); i++)
{
- if ( (mudela_staff_p_list_.size_i () != 1)
- && (i->car_p_ == mudela_staff_p_list_.car_l ()))
+ if ( (mudela_staff_p_list_.size() != 1)
+ && (i == mudela_staff_p_list_.top()))
continue;
- mudela_stream << "\\type Staff = \"" << i->car_p_->id_str () << "\" ";
- mudela_stream << String ("\\" + i->car_p_->id_str ()) << "\n";
+ mudela_stream << "\\type Staff = \"" << i->id_str() << "\" ";
+ mudela_stream << String ("\\" + i->id_str ()) << "\n";
}
- if (mudela_staff_p_list_.size_i () > 1)
+ if (mudela_staff_p_list_.size() > 1)
mudela_stream << ">\n";
+
mudela_stream << "\\paper{}\n";
mudela_stream << "\\midi{\n";
// let's not use silly 0 track
- mudela_staff_p_list_.tail_car_l ()->mudela_tempo_l_->output (mudela_stream);
+ mudela_staff_p_list_.bottom()->mudela_tempo_l_->output (mudela_stream);
mudela_stream << "}\n";
mudela_stream << "}\n";
}
void
-Mudela_score::process ()
+Mudela_score::process()
{
- LOGOUT (NORMAL_ver) << '\n' << _ ("Processing...") << endl;
+ LOGOUT(NORMAL_ver) << '\n' << _ ("Processing...") << endl;
- LOGOUT (DEBUG_ver) << "columns\n";
+ LOGOUT(DEBUG_ver) << "columns\n";
+ // for (PCursor<Mudela_column*> i (mudela_column_p_list_); i.ok(); i++)
+ // LOGOUT(DEBUG_ver) << "At: " << i->at_mom() << '\n';
- settle_columns ();
- filter_tempo ();
- quantify_columns ();
- quantify_durations ();
+ settle_columns();
+ filter_tempo();
+ quantify_columns();
+ quantify_durations();
- LOGOUT (NORMAL_ver) << '\n' << _ ("Creating voices...") << endl;
+ LOGOUT(NORMAL_ver) << '\n' << _ ("Creating voices...") << endl;
int track_i = 0;
- for (Cons<Mudela_staff>* i = mudela_staff_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+ for (PCursor<Mudela_staff*> i (mudela_staff_p_list_); i.ok(); i++)
{
- LOGOUT (NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
- i->car_p_->process ();
- LOGOUT (NORMAL_ver) << endl;
+ LOGOUT(NORMAL_ver) << _ ("track ") << track_i++ << ": " << flush;
+ i->process();
+ LOGOUT(NORMAL_ver) << endl;
}
}
void
-Mudela_score::filter_tempo ()
+Mudela_score::filter_tempo()
{
- LOGOUT (NORMAL_ver) << '\n' << _ ("NOT Filtering tempo...") << endl;
+ LOGOUT(NORMAL_ver) << '\n' << _ ("NOT Filtering tempo...") << endl;
}
void
-Mudela_score::quantify_columns ()
+Mudela_score::quantify_columns()
{
// ugh
- if (Duration_convert::no_quantify_b_s)
+ if (Duration_convert::no_quantify_b_s)
{
- LOGOUT (NORMAL_ver) << '\n' << _ ("NOT Quantifying columns...") << endl;
+ LOGOUT(NORMAL_ver) << '\n' << _("NOT Quantifying columns...") << endl;
return;
}
- LOGOUT (NORMAL_ver) << '\n' << _ ("Quantifying columns...") << endl;
+ LOGOUT(NORMAL_ver) << '\n' << _("Quantifying columns...") << endl;
int current_bar_i = 0;
- Moment bar_mom = mudela_time_signature_l_->bar_mom ();
+ Moment bar_mom = mudela_time_signature_l_->bar_mom();
int n = 5 >? Duration_convert::no_smaller_than_i_s;
n = Duration_convert::type2_i (n);
Moment s = Moment (1, n);
- for (int i = 0; i < column_l_array_.size (); i++)
+ Moment sh = Moment (1, 2 * n);
+ for (int i = 0; i < column_l_array_.size(); i++)
{
column_l_array_ [i]->at_mom_ =
- s * Moment ( (int) ( (column_l_array_ [i]->at_mom ()) / s));
+ s * Moment( (int) ( (column_l_array_ [i]->at_mom()) / s));
int bar_i = (int) (column_l_array_ [i]->at_mom () / bar_mom) + 1;
if (bar_i > current_bar_i)
current_bar_i = bar_i;
}
}
- LOGOUT (NORMAL_ver) << endl;
+ LOGOUT(NORMAL_ver) << endl;
}
void
-Mudela_score::quantify_durations ()
+Mudela_score::quantify_durations()
{
- // LOGOUT (NORMAL_ver) << '\n' << "Quantifying durations..." << endl;
+ // LOGOUT(NORMAL_ver) << '\n' << "Quantifying durations..." << endl;
}
void
-Mudela_score::settle_columns ()
+Mudela_score::settle_columns()
{
- LOGOUT (NORMAL_ver) << '\n' << _ ("Settling columns...") << endl;
+ // LOGOUT(NORMAL_ver) << '\n' << "NOT Settling columns..." << endl;
+ // return;
+ LOGOUT(NORMAL_ver) << '\n' << _("Settling columns...") << endl;
+
+#if 0
+ assert (!column_l_array_.size());
+ int n = mudela_column_p_list_.size();
+ // huh?
+ // column_l_array_.set_size (n);
+ for (PCursor<Mudela_column*> i (mudela_column_p_list_); i.ok(); i++)
+ column_l_array_.push (*i);
+#endif
- int n = column_l_array_.size ();
+ int n = column_l_array_.size();
int start_i = 0;
int end_i = 0;
smallest_dur.durlog_i_ = 6;
Moment const noise_mom = Duration_convert::dur2_mom (smallest_dur)
/ Moment (2);
- for (int i = 0; i < n; i++)
+ for (int i = 0; i < n; i++)
{
- if (!start_i)
+ if (!start_i)
{
start_i = end_i = i;
- start_mom = column_l_array_ [i]->at_mom ();
+ start_mom = column_l_array_ [i]->at_mom();
continue;
}
// find all columns within noise's distance
- while ( (i < n)
- && (column_l_array_ [i]->at_mom () - start_mom < noise_mom))
+ while ( (i < n)
+ && (column_l_array_ [i]->at_mom() - start_mom < noise_mom))
end_i = ++i;
// bluntly set all to time of first in group
- for (int j = start_i; j < end_i; j++)
+ for (int j = start_i; j < end_i; j++)
column_l_array_ [j]->at_mom_ = start_mom;
start_i = end_i = 0;
#include "mudela-voice.hh"
#include "mudela-score.hh"
-#include "killing-cons.tcc"
-
extern Mudela_score* mudela_score_l_g;
Mudela_staff::Mudela_staff (int number_i, String copyright_str, String track_name_str, String instrument_str)
void
Mudela_staff::add_item (Mudela_item* mudela_item_p)
{
- mudela_item_p_list_.append (new Killing_cons <Mudela_item> (mudela_item_p, 0));
- if (mudela_item_p->mudela_column_l_)
+ mudela_item_p_list_.bottom().add (mudela_item_p);
+ if (mudela_item_p->mudela_column_l_)
mudela_item_p->mudela_column_l_->add_item (mudela_item_p);
}
void
-Mudela_staff::eat_voice (Cons_list<Mudela_item>& items)
+Mudela_staff::eat_voice (Link_list<Mudela_item*>& items)
{
Mudela_voice* voice_p = new Mudela_voice (this);
- mudela_voice_p_list_.append (new Killing_cons<Mudela_voice> (voice_p, 0));
+ mudela_voice_p_list_.bottom().add (voice_p);
- // Moment mom = items.top ()->at_mom ();
+ // Moment mom = items.top()->at_mom();
Moment mom = 0;
- for (Cons<Mudela_item>** pp = &items.head_cons_p_; *pp;)
+ for (PCursor<Mudela_item*> i (items); i.ok();)
{
- Cons<Mudela_item>* i = *pp;
- LOGOUT (DEBUG_ver) << "At: " << i->car_p_->at_mom ().str () << "; ";
- LOGOUT (DEBUG_ver) << "dur: " << i->car_p_->duration_mom ().str () << "; ";
- LOGOUT (DEBUG_ver) << "mom: " << mom.str () << " -> ";
- if (i->car_p_->at_mom () > mom)
+ LOGOUT(DEBUG_ver) << "At: " << i->at_mom ().str () << "; ";
+ LOGOUT(DEBUG_ver) << "dur: " << i->duration_mom ().str () << "; ";
+ LOGOUT(DEBUG_ver) << "mom: " << mom.str () << " -> ";
+ if (i->at_mom() > mom)
{
- Moment dur = i->car_p_->at_mom () - mom;
+ Moment dur = i->at_mom() - mom;
// ugh, need score
Mudela_column* start = mudela_score_l_g->find_column_l (mom);
voice_p->add_item (new Mudela_skip (start, dur));
- mom = i->car_p_->at_mom ();
+ mom = i->at_mom();
}
- if (i->car_p_->at_mom () == mom)
+ if (i->at_mom() == mom)
{
- mom = i->car_p_->at_mom () + i->car_p_->duration_mom ();
- Cons<Mudela_item>* c = items.remove_cons_p (pp);
- voice_p->add_item (c->car_p_);
- delete c;
+ mom = i->at_mom() + i->duration_mom();
+ voice_p->add_item (i.remove_p());
+ // ugh
}
- else if (*pp)
- pp = &i->next_cons_p_;
- LOGOUT (DEBUG_ver) << "mom: " << mom.str () << '\n';
+ else if (i.ok())
+ i++;
+ LOGOUT(DEBUG_ver) << "mom: " << mom.str () << '\n';
}
}
String
-Mudela_staff::id_str ()
+Mudela_staff::id_str()
{
String id (name_str ());
char *cp = id.ch_l ();
- char *end = cp + id.length_i ();
+ char *end = cp + id.length_i();
for (;cp < end; cp++)
{
if (!isalpha (*cp))
}
String
-Mudela_staff::name_str ()
+Mudela_staff::name_str()
{
- if (name_str_.length_i ())
+ if (name_str_.length_i())
return name_str_;
return String ("track") + to_str (char ('A' - 1 + number_i_));
}
void
Mudela_staff::output (Mudela_stream& mudela_stream_r)
{
- mudela_stream_r << id_str () << " = \\notes";
- mudela_stream_r << (mudela_voice_p_list_.size_i () > 1 ? "<" : "{");
+ mudela_stream_r << id_str() << " = \\notes";
+ mudela_stream_r << (mudela_voice_p_list_.size() > 1 ? "<" : "{");
mudela_stream_r << '\n';
mudela_stream_r << _ ("% midi copyright:") << copyright_str_ << '\n';
mudela_stream_r << _ ("% instrument:") << instrument_str_ << '\n';
// don't use last duration mode
// mudela_stream_r << "\\duration 4;\n";
- if (mudela_voice_p_list_.size_i () == 1)
- mudela_voice_p_list_.car_l ()->output (mudela_stream_r);
+ if (mudela_voice_p_list_.size() == 1)
+ mudela_voice_p_list_.top()->output (mudela_stream_r);
else
- for (Cons<Mudela_voice>* i = mudela_voice_p_list_.head_cons_p_; i; i = i->next_cons_p_)
+ for (PCursor<Mudela_voice*> i (mudela_voice_p_list_); i.ok(); i++)
{
mudela_stream_r << "{ ";
- i->car_p_->output (mudela_stream_r);
+ i->output (mudela_stream_r);
mudela_stream_r << "} ";
}
- mudela_stream_r << (mudela_voice_p_list_.size_i () > 1 ? "\n>" : "\n}");
- mudela_stream_r << " % " << name_str () << '\n';
+ mudela_stream_r << (mudela_voice_p_list_.size() > 1 ? "\n>" : "\n}");
+ mudela_stream_r << " % " << name_str() << '\n';
}
void
Mudela_staff::output_mudela_begin_bar (Mudela_stream& mudela_stream_r, Moment now_mom, int bar_i)
{
- Moment bar_mom = mudela_time_signature_l_->bar_mom ();
+ Moment bar_mom = mudela_time_signature_l_->bar_mom();
Moment into_bar_mom = now_mom - Moment (bar_i - 1) * bar_mom;
- if (bar_i > 1)
+ if (bar_i > 1)
{
- if (!into_bar_mom)
+ if (!into_bar_mom)
mudela_stream_r << "|\n";
}
mudela_stream_r << "% " << String_convert::i2dec_str (bar_i, 0, ' ');
- if (into_bar_mom)
+ if (into_bar_mom)
mudela_stream_r << ":" << Duration_convert::dur2_str (Duration_convert::mom2_dur (into_bar_mom));
mudela_stream_r << '\n';
}
void
Mudela_staff::output_mudela_rest (Mudela_stream& mudela_stream_r, Moment begin_mom, Moment end_mom)
{
- Moment bar_mom = mudela_time_signature_l_->bar_mom ();
+ Moment bar_mom = mudela_time_signature_l_->bar_mom();
Moment now_mom = begin_mom;
int begin_bar_i = (int) (now_mom / bar_mom) + 1;
int end_bar_i = (int) (end_mom / bar_mom) + 1;
- if (end_bar_i == begin_bar_i)
+ if (end_bar_i == begin_bar_i)
{
output_mudela_rest_remain (mudela_stream_r, end_mom - begin_mom);
return;
//fill current bar
Moment begin_bar_mom = Moment (begin_bar_i - 1) * bar_mom;
- if (now_mom > begin_bar_mom)
+ if (now_mom > begin_bar_mom)
{
int next_bar_i = (int) (now_mom / bar_mom) + 2;
Moment next_bar_mom = Moment (next_bar_i - 1) * bar_mom;
assert (next_bar_mom <= end_mom);
Moment remain_mom = next_bar_mom - now_mom;
- if (remain_mom > Moment (0))
+ if (remain_mom > Moment (0))
{
output_mudela_rest_remain (mudela_stream_r, remain_mom);
now_mom += remain_mom;
// fill whole bars
int count_i = end_bar_i - bar_i;
- for (int i = 0; i < count_i; i++)
+ for (int i = 0; i < count_i; i++)
{
int begin_bar_i = check_begin_bar_i (now_mom, bar_i);
- if (begin_bar_i)
+ if (begin_bar_i)
output_mudela_begin_bar (mudela_stream_r, now_mom, begin_bar_i);
mudela_stream_r << "r1 ";
// *mudela_stream_r.os_p_ << flush;
- if (begin_bar_i)
- LOGOUT (NORMAL_ver) << begin_bar_i << flush;
+ if (begin_bar_i)
+ LOGOUT(NORMAL_ver) << begin_bar_i << flush;
bar_i = check_end_bar_i (now_mom, bar_i);
now_mom += bar_mom;
}
// use "int i" here, and gcc 2.7.2 hits internal compiler error
int ii = check_begin_bar_i (now_mom, bar_i);
- if (ii)
+ if (ii)
output_mudela_begin_bar (mudela_stream_r, now_mom, ii);
// bar_i = check_end_bar_i (now_mom, bar_i);
Moment remain_mom = end_mom - Moment (end_bar_i - 1) * bar_mom;
- if (remain_mom > Moment (0))
+ if (remain_mom > Moment (0))
{
output_mudela_rest_remain (mudela_stream_r, remain_mom);
now_mom += remain_mom;
void
Mudela_staff::output_mudela_rest_remain (Mudela_stream& mudela_stream_r, Moment mom)
{
- if (Duration_convert::no_quantify_b_s)
+ if (Duration_convert::no_quantify_b_s)
{
Duration dur = Duration_convert::mom2_dur (mom);
- mudela_stream_r << "r" << dur.str () << " ";
- // assert (mom == dur.mom ());
- assert (mom == dur.length ());
+ mudela_stream_r << "r" << dur.str() << " ";
+ // assert (mom == dur.mom());
+ assert (mom == dur.length());
return;
}
Duration dur = Duration_convert::mom2standardised_dur (mom);
- if (dur.type_i_>-10)
- mudela_stream_r << "r" << dur.str () << " ";
+ if (dur.type_i_>-10)
+ mudela_stream_r << "r" << dur.str() << " ";
}
#endif
void
-Mudela_staff::process ()
+Mudela_staff::process()
{
/*
group items into voices
mudela_time_signature_l_ = mudela_score_l_g->mudela_time_signature_l_;
mudela_tempo_l_ = mudela_score_l_g->mudela_tempo_l_;
- Cons_list<Mudela_item> items;
- for (Cons<Mudela_item>* i = mudela_item_p_list_.head_cons_p_; i; i = i->next_cons_p_)
- //items.bottom ().add (*i);
- items.append (new Cons<Mudela_item> (i->car_p_, 0));
+ Link_list<Mudela_item*> items;
+ for (PCursor<Mudela_item*> i (mudela_item_p_list_); i.ok(); i++)
+ items.bottom().add (*i);
- while (!items.empty_b ())
+ while (items.size())
eat_voice (items);
}
void
Mudela_voice::add_item (Mudela_item* mudela_item_l)
{
- mudela_item_l_list_.append (new Cons<Mudela_item> (mudela_item_l, 0));
+ mudela_item_l_list_.bottom().add (mudela_item_l);
}
Moment
-Mudela_voice::begin_mom ()
+Mudela_voice::begin_mom()
{
- return !mudela_item_l_list_.empty_b () ?
- mudela_item_l_list_.car_l ()->at_mom () : Moment (0);
+ return mudela_item_l_list_.size() ?
+ mudela_item_l_list_.top()->at_mom() : Moment (0);
}
Moment
-Mudela_voice::end_mom ()
+Mudela_voice::end_mom()
{
- return !mudela_item_l_list_.empty_b () ?
- mudela_item_l_list_.tail_car_l ()->at_mom () : Moment (0);
+ return mudela_item_l_list_.size() ?
+ mudela_item_l_list_.bottom()->at_mom() : Moment (0);
}
static int const FAIRLY_LONG_VOICE_i = 6;
void
Mudela_voice::output (Mudela_stream& mudela_stream_r)
{
- if (mudela_item_l_list_.empty_b ())
+ if (!mudela_item_l_list_.size())
return;
- if (mudela_item_l_list_.size_i () > FAIRLY_LONG_VOICE_i)
+ if (mudela_item_l_list_.size() > FAIRLY_LONG_VOICE_i)
mudela_stream_r << '\n';
int current_bar_i = 0;
- Moment bar_mom = mudela_staff_l_->mudela_time_signature_l_->bar_mom ();
+ Moment bar_mom = mudela_staff_l_->mudela_time_signature_l_->bar_mom();
- for (Cons<Mudela_item>* i = mudela_item_l_list_.head_cons_p_; i; i = i->next_cons_p_)
+ for (PCursor<Mudela_item*> i (mudela_item_l_list_); i.ok(); i++)
{
- Moment at_mom = i->car_p_->mudela_column_l_->at_mom ();
+ Moment at_mom = i->mudela_column_l_->at_mom();
int bar_i = (int) (at_mom / bar_mom) + 1;
- if (bar_i > current_bar_i)
+ if (bar_i > current_bar_i)
{
- if (current_bar_i)
+ if (current_bar_i)
{
- if (at_mom == Moment (bar_i - 1) * bar_mom)
+ if (at_mom == Moment (bar_i - 1) * bar_mom)
mudela_stream_r << "|";
mudela_stream_r << "\n% ";
mudela_stream_r << String_convert::i2dec_str (bar_i, 0, ' ');
mudela_stream_r << '\n';
}
- LOGOUT (NORMAL_ver) << "[" << bar_i << "]" << flush;
+ LOGOUT(NORMAL_ver) << "[" << bar_i << "]" << flush;
current_bar_i = bar_i;
}
- mudela_stream_r << *i->car_p_;
+ mudela_stream_r << **i;
}
- if (mudela_item_l_list_.size_i () > FAIRLY_LONG_VOICE_i)
+ if (mudela_item_l_list_.size() > FAIRLY_LONG_VOICE_i)
mudela_stream_r << '\n';
}
+//
+// template.cc -- implementemplate
+// ugh: must have unique name for Cygnus' gcc:
+// liblily.a(template.o): In function `GLOBAL_$I$template.cc':
+// template.cc:28: multiple definition of `global constructors keyed to template.cc'
+//
+// copyright 1997 Jan Nieuwenhuizen <janneke@gnu.org>
+
+#include "proto.hh"
+#include "list.hh"
+#include "list.tcc"
+#include "cursor.tcc"
+
+class istream;
+class ostream;
+
+#include "mudela-item.hh"
+#include "mudela-column.hh"
+#include "mudela-staff.hh"
+#include "mudela-voice.hh"
+#include "mudela-staff.hh"
+#include "mudela-score.hh"
+#include "pcursor.hh"
+#include "plist.hh"
+#include "pcursor.tcc"
+#include "plist.tcc"
+
+POINTERLIST_INSTANTIATE(Mudela_item);
+POINTERLIST_INSTANTIATE(Mudela_staff);
+POINTERLIST_INSTANTIATE(Mudela_voice);
+POINTERLIST_INSTANTIATE(Mudela_column);
+POINTERLIST_INSTANTIATE(Mudela_score);
1 copy mul exch 1 copy mul add sqrt
} bind def
-/draw_tuplet % dx dy thick dir
+/draw_tuplet % height dx dy thick dir
{
% urg: the only Level-2 PS, check effect in print
% true setstrokeadjust
1 setlinejoin
/tuplet_dy exch def
/tuplet_dx exch def
+ /tuplet_h exch def
staffheight 2 div /tuplet_gapx exch def
tuplet_dy tuplet_dx div tuplet_gapx mul /tuplet_gapy exch def
- staffheight 4 div dir mul /tuplet_h exch def
+
0 0 moveto
0 tuplet_h lineto
/vrule % width depth height
{
- gsave
- 3 -1 roll setlinewidth
- %neg 0 exch moveto
- 0 exch moveto
- neg 0 exch lineto stroke
- grestore
} bind def
-/draw_stem % breapth width depth height
+
+%
+% FIXME. translate to middle of box.
+%
+
+/draw_box % breapth width depth height
{
gsave
- 4 -1 roll neg 0 translate
- vrule
+ 4 -1 roll
+ dup
+ neg 0 translate
+ 4 -1 roll
+ add
+
+ setlinewidth
+
+ 0 exch moveto
+ neg 0 exch lineto stroke
+
grestore
} bind def
(string-append
(map (lambda (n) (string-append (number->string n ) " ")) l)))
+(define (reduce operator list)
+ (if (null? (cdr list)) (car list)
+ (operator (car list) (reduce operator (cdr list)))
+ )
+ )
+
+
+(define (glue-2-strings a b) (string-append a " " b))
+
(define
(numbers->string l)
- (apply string-append
- (map (lambda (n) (string-append (number->string n) " ")) l)))
+ (reduce glue-2-strings (map number->string l)))
(define (chop-decimal x) (if (< (abs x) 0.001) 0.0 x))
(define (number->dim x)
(string-append
- (number->string (chop-decimal x)) "pt "))
+ (number->string (chop-decimal x)) " pt "))
(define (placebox x y s)
(string-append
(define (text s)
(string-append "\\hbox{" (output-tex-string s) "}"))
- (define (tuplet dx dy thick dir)
- (embedded-ps ((ps-scm 'tuplet) dx dy thick dir)))
+ (define (tuplet ht dx dy thick dir)
+ (embedded-ps ((ps-scm 'tuplet) ht dx dy thick dir)))
(define (volta w thick last)
(embedded-ps ((ps-scm 'volta) w thick last)))
(define (cached-fontname i)
(string-append
- "lilyfont"
+ " lilyfont"
(make-string 1 (integer->char (+ 65 i)))))
(define (select-font font-name)
(numbers->string (list width slope thick)) " draw_beam " ))
(define (bracket h)
- (invoke-dim1 "draw_bracket" h))
+ (invoke-dim1 " draw_bracket" h))
(define (char i)
- (invoke-char "show" i))
+ (invoke-char " show" i))
(define (crescendo w h cont)
(string-append
(numbers->string (list w h (inexact->exact cont)))
- "draw_crescendo"))
+ " draw_crescendo"))
(define (dashed-slur thick dash l)
(string-append
(define (decrescendo w h cont)
(string-append
(numbers->string (list w h (inexact->exact cont)))
- "draw_decrescendo"))
+ " draw_decrescendo"))
(define (end-output)
(define (filledbox breapth width depth height)
(string-append (numbers->string (list breapth width depth height))
- "draw_stem" ))
+ " draw_box" ))
;; obsolete?
(define (font-def i s)
(string-append
(number->string x) " "
(number->string y) " "
- "rulesym"))
+ " rulesym"))
(define (bezier-sandwich l)
(string-append
(apply string-append (map control->string l))
" draw_bezier_sandwich"))
- (define (start-line)
+ (define (start-line height)
(begin
(clear-fontcache)
"\nstart_line {\n"))
(define (stem breapth width depth height)
(string-append (numbers->string (list breapth width depth height))
- "draw_stem" ))
+ " draw_box" ))
(define (stop-line)
"}\nstop_line\n")
(define (volta w thick last)
(string-append
(numbers->string (list w thick (inexact->exact last)))
- "draw_volta"))
+ " draw_volta"))
- (define (tuplet dx dy thick dir)
+ (define (tuplet ht dx dy thick dir)
(string-append
- (numbers->string (list dx dy thick (inexact->exact dir)))
- "draw_tuplet"))
+ (numbers->string (list ht dx dy thick (inexact->exact dir)))
+ " draw_tuplet"))
(define (unknown)
#
# All non-english comments are NOT in swedish, they are norwegian!
# TODO:
+# * output various stuff either via sys.stderr or sys.stdout, not using print.
# * center option (??)
# * make mudela-book understand usepackage{geometry}
# * check that linewidth set in \paper is not wider than actual linewidth?
outdir = 'out'
initfile = ''
program_version = '0.5.3'
+include_path = ['.']
out_files = []
documentclass_re = re.compile('\\\\documentclass')
twocolumn_re = re.compile('\\\\twocolumn')
onecolumn_re = re.compile('\\\\onecolumn')
+mudela_file_re = re.compile('\\\\mudelafile{([^}]+)}')
preMudelaExample_re = re.compile('\\\\def\\\\preMudelaExample')
postMudelaExample_re = re.compile('\\\\def\\\\postMudelaExample')
boundingBox_re = re.compile('%%BoundingBox: ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)')
int(s.groups()[3])-int(s.groups()[1]))
+def find_file (name):
+ for a in include_path:
+ try:
+ nm = os.path.join (a, name)
+ f = open (nm)
+ return nm
+ except IOError:
+ pass
+ return ''
+
+
class CompileStatus:
pass
class SomethingIsSeriouslyBroken:
status = os.system ('diff -q %s %s' % (self.temp_filename, inf))
if status:
os.rename (self.temp_filename, inf)
- if need_recompile_b(inf, outf):
+
+ recompile_b = need_recompile_b(inf, outf)
+ if recompile_b:
out_files.append((self.graphic_type, inf))
+ return recompile_b
+
def insert_me_string(self):
"Returns a string that can be used directly in latex."
if self.graphic_type == 'tex':
except:
continue
raise IOError
+
def get_lines (self):
lines = self.infile.readlines ()
(retlines, retdeps) = ([],[self.filename])
# This code should be rewritten, it looks terrible
r_mud = defined_mudela_cmd_re.search(line)
if r_mud:
+ # TODO document this
ss = "\\\\verb(?P<xx>[^a-zA-Z])\s*\\\\%s\s*(?P=xx)" \
% re.escape(r_mud.group()[1:])
# just append the line if the command is inside \verb|..|
self.mudtex.write ('\\def\\preMudelaExample{}\n')
if not postMudelaDef:
self.mudtex.write ('\\def\\postMudelaExample{}\n')
+
+ elif mudela_file_re.search(line):
+ r = mudela_file_re.search(line)
+
+ self.mudela = Mudela_output(self.gen_basename())
+ fn = r.groups ()[0]
+ full_path = find_file (fn)
+ if not full_path:
+ print 'error: can\'t find file `%s\'.' % fn
+ sys.exit (1)
+
+ f = open (full_path, 'r')
+ lines =f.readlines ()
+ for x in lines:
+ self.mudela.write (x)
+ stat =self.mudela.close ()
+ if stat:
+ print "(File %s needs recompiling)\n" % full_path
+ self.mudtex.write (self.mudela.insert_me_string())
+ self.deps.append (full_path)
+ del self.mudela
+ self.mudela = None
+ self.fine_count = self.fine_count + 1
+ continue
elif begin_mudela_re.search (line) and not latex_verbatim:
Props.clear_for_new_block()
if __debug__:
self.mode = 'latex'
continue
+
if self.mode == 'mudela':
self.mudela.write (line)
if self.verbatim:
--force-mudela-fontsize=??pt force fontsize for all inline mudela
--force-verbatim make all mudela verbatim\n
--dependencies write dependencies
+ --include include path
--init mudela-book initfile
"""
)
def write_deps (fn, out, deps):
- out_fn = outdir + '/' + fn
- print '`writing `%s\'\n\'' % out_fn
+ out_fn = os.path.join (outdir, fn)
+
+ print 'writing `%s\'\n' % out_fn
f = open (out_fn, 'w')
- f.write ('%s: %s\n'% (outdir + '/' + out + '.dvi',
+ target = re.sub (os.sep + os.sep, os.sep, os.path.join (outdir, out + '.latex'))
+ f.write ('%s: %s\n'% (target,
reduce (lambda x,y: x + ' '+ y, deps)))
f.close ()
outname = ''
try:
(options, files) = getopt.getopt(
- sys.argv[1:], 'hd:o:', ['outdir=', 'outname=',
+ sys.argv[1:], 'hd:o:I:', ['outdir=', 'outname=',
'default-mudela-fontsize=',
'force-mudela-fontsize=',
- 'help', 'dependencies',
+ 'help', 'dependencies', 'include=',
'force-verbatim', 'init='])
except getopt.error, msg:
print "error:", msg
for opt in options:
o = opt[0]
a = opt[1]
- if o == '--outname' or o == '-o':
+ if o == '--include' or o == '-I':
+ include_path.append (a)
+ elif o == '--outname' or o == '-o':
if len(files) > 1:
#HACK
print "Mudela-book is confused by --outname on multiple files"
sys.exit(1)
outname = a
- if o == '--outdir' or o == '-d':
+ elif o == '--outdir' or o == '-d':
outdir = a
- if o == '--help' or o == '-h':
+ elif o == '--help' or o == '-h':
help ()
- if o == '--dependencies':
+ elif o == '--dependencies':
do_deps = 1
- if o == '--default-mudela-fontsize':
+ elif o == '--default-mudela-fontsize':
if not fontsize_pt2i.has_key(a):
print "Error: illegal fontsize:", a
print " accepted fontsizes are: 11pt, 13pt, 16pt, 20pt, 26pt"
sys.exit()
Props.setMudelaFontsize(fontsize_pt2i[a], 'init')
- if o == '--force-mudela-fontsize':
+ elif o == '--force-mudela-fontsize':
if not fontsize_pt2i.has_key(a):
print "Error: illegal fontsize:", a
print " accepted fontsizes are: 11pt, 13pt, 16pt, 20pt, 26pt"
sys.exit()
Props.force_mudela_fontsize = fontsize_pt2i[a]
- if o == '--force-verbatim':
+ elif o == '--force-verbatim':
Props.force_verbatim_b = 1
- if o == '--init':
+ elif o == '--init':
initfile = a
if outdir[-1:] != '/':
outdir = outdir + '/'
+ # r""" ... """ means: leave escape seqs alone.
defined_mudela_cmd = {'mudela': r"""
\begin{mudela}[eps \fontoptions]
\type Staff <
for i in d.keys():
defined_mudela_cmd[i] = d[i]
del d
- c = defined_mudela_cmd.keys()[0]
- for x in defined_mudela_cmd.keys()[1:]:
- c = c + '|'+x
+
+ c = string.join (defined_mudela_cmd.keys(), '|')
+
defined_mudela_cmd_re = re.compile("\\\\(%s)(\[(\d*pt)\])*{([^}]*)}" %c)
if not os.path.isdir(outdir):
my_depname = my_outname + '.dep'
inp = Main_tex_input (input_filename, my_outname)
inp.do_it ()
-# os.system('latex %s/%s.latex' % (outdir, my_outname))
if do_deps:
write_deps (my_depname, my_outname, inp.deps)
#
# (c) 1998 Jan Nieuwenhuizen <janneke@gnu.org>
+# TODO: regex -> re.
+
name = 'mup-to-ly'
version = '0.1'
-$(outdir)/%.pfa: %.mf
# urg
# i've got no idea what this scaling could be for, on both sides...
# it seems that 'low_res', which should be all we ever need according
# to the metapost mfplain guru, really does 200dpi, iso 600dpi (minimun)
# -$(METAPOST) "&mfmp \mode=ljfour; \mag=100.0; batchmode; input $<"
# -$(METAPOST) "&mfplain \mode=lowres; \mag=100.0; batchmode; input $<"
+
+$(outdir)/%.0: %.mf
-$(METAPOST) "&mfplain \mode=lowres; \mag=30.0; batchmode; input $<"
- $(PYTHON) $(depth)/buildscripts/ps-to-pfa.py $<
+
+$(outdir)/%.pfa: $(outdir)/%.0
+ $(PYTHON) $(depth)/buildscripts/ps-to-pfa.py --output $(basename $<).pfa $<
rm -f $(basename $(@F)).[0-9]*
rm -f $(basename $<).log $(basename $<).tfm