From 748e6176ab755ccf841f408d13d5818260a05d32 Mon Sep 17 00:00:00 2001 From: Han-Wen Nienhuys Date: Tue, 5 Nov 1996 17:55:42 +0100 Subject: [PATCH] release: 0.0.5 --- .dstreamrc | 4 +- Makefile | 8 +-- README | 2 + Sources.make | 4 +- TODO | 7 +-- boxes.cc | 14 ++++-- boxes.hh | 2 +- break.cc | 27 ++++++++--- calcideal.cc | 10 ++-- command.cc | 42 +++++----------- command.hh | 8 ++- debug.cc | 3 +- debug.hh | 6 ++- flower/Makefile | 2 +- flower/Sources.make | 3 +- flower/TODO | 1 + flower/assoc.hh | 2 + flower/associter.hh | 42 ++++++++++++++++ flower/dstream.cc | 26 +++++----- flower/dstream.hh | 6 ++- flower/plist.hh | 2 +- flower/plist.inl | 13 +++-- getcommands.cc | 58 ++++++++++++++++++++++ item.cc | 5 ++ item.hh | 1 + lexer.l | 6 +++ lilyponddefs.tex | 11 ++++- lookupsyms.cc | 4 +- maartje.ly | 17 ++++--- make_patch | 2 +- misc.cc | 4 +- misc.hh | 4 +- molecule.cc | 15 +++++- molecule.hh | 2 + mtime.hh | 8 --- parseconstruct.hh | 6 ++- parser.y | 33 +++++++++---- pcol.cc | 31 ++++++++---- pcol.hh | 2 +- proto.hh | 16 +++++- pscore.cc | 47 +++++++++++------- pscore.hh | 2 +- request.hh | 4 +- rhythmstaf.cc | 13 ++--- rhythmstaf.hh | 3 ++ sccol.cc | 2 +- sccol.hh | 7 ++- scommands.cc | 116 ++++++++++++++++++++++++++++++++++++-------- scommands.hh | 9 +++- score.cc | 56 ++++++++++++++------- score.hh | 36 +++++++------- scores.cc | 3 ++ staff.cc | 14 ++++-- staff.hh | 36 ++++++++------ stcol.cc | 4 +- stcol.hh | 2 +- suzan.ly | 3 +- symbol.ini | 6 +-- table.cc | 3 ++ voice.cc | 4 +- voice.hh | 10 ++-- 61 files changed, 580 insertions(+), 259 deletions(-) create mode 100644 flower/associter.hh create mode 100644 getcommands.cc delete mode 100644 mtime.hh diff --git a/.dstreamrc b/.dstreamrc index b5fa669d14..fccd8d5c37 100644 --- a/.dstreamrc +++ b/.dstreamrc @@ -13,4 +13,6 @@ Parser 1 Lexer 1 parse_duration 1 parse_pitch 1 - +Col_configuration 1 +Command 1 +Score_commands 1 \ No newline at end of file diff --git a/Makefile b/Makefile index 2f5b450761..c1636f4012 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ MAJVER=0 MINVER=0 -PATCHLEVEL=4 +PATCHLEVEL=5 # # @@ -28,8 +28,10 @@ DFILES=$(hdr) $(mycc) $(othersrc) $(OFILES) $(IFILES) $(SCRIPTS) $(DOC) #compiling LOADLIBES=-L$(FLOWERDIR) -lflower FLOWERDIR=../flower -#DEFINES=-DNDEBUG -DNPRINT -O2 -CXXFLAGS=$(DEFINES) -I$(FLOWERDIR) -pipe -Wall -W -pedantic -g +#DEFINES=-DNDEBUG -DNPRINT -O2 # speedy +DEFINES=-g # lots of debugging info + +CXXFLAGS=$(DEFINES) -I$(FLOWERDIR) -pipe -Wall -W -pedantic FLEX=flex BISON=bison exe=$(PACKAGENAME) diff --git a/README b/README index 412248b144..0ad234c7ff 100644 --- a/README +++ b/README @@ -6,4 +6,6 @@ patches to me, hanwen@stack.urc.tue.nl +If you actually want to use this, you'd better use the "speed" +compilation flags in the Makefile diff --git a/Sources.make b/Sources.make index 02eac2a6c0..6c420edad7 100644 --- a/Sources.make +++ b/Sources.make @@ -3,7 +3,7 @@ hdr= qlp.hh \ pcol.hh proto.hh pstaff.hh line.hh\ const.hh glob.hh molecule.hh boxes.hh pscore.hh item.hh tex.hh\ request.hh voice.hh command.hh staff.hh linestaff.hh \ - tstream.hh mtime.hh rhythmstaf.hh\ + tstream.hh rhythmstaf.hh\ parseconstruct.hh debug.hh globvars.hh keyword.hh\ misc.hh score.hh notename.hh lexer.hh symtable.hh\ symbol.hh main.hh dimen.hh paper.hh lookupsyms.hh\ @@ -19,5 +19,5 @@ mycc= qlp.cc qlpsolve.cc \ pstaff.cc tstream.cc version.cc\ calcideal.cc scores.cc identifier.cc \ dimen.cc paper.cc lookupsyms.cc scommands.cc\ - sccol.cc stcol.cc\ + sccol.cc stcol.cc getcommands.cc\ template1.cc template2.cc template3.cc diff --git a/TODO b/TODO index 3f91b6bbd8..cce684e09c 100644 --- a/TODO +++ b/TODO @@ -1,7 +1,4 @@ -bug in BAR. -dot spacing -typeset direction. -beam -stem +melodie staff. +beam + stem diff --git a/boxes.cc b/boxes.cc index 74475b4530..ebfc08abfe 100644 --- a/boxes.cc +++ b/boxes.cc @@ -2,11 +2,14 @@ #include "const.hh" void -Interval:: set_empty() { - min = INFTY; - max = -INFTY; +Interval::set_empty() { + min = INFTY; + max = -INFTY; +} +Real +Interval::length() const { + return max-min; } - Box::Box(svec s) { assert(s.sz() == 4); @@ -22,6 +25,7 @@ Box::Box() Box::Box(Interval ix, Interval iy) { - x=ix; + x = ix; y = iy; } + diff --git a/boxes.hh b/boxes.hh index c9ff3e62ef..5d0be85452 100644 --- a/boxes.hh +++ b/boxes.hh @@ -49,7 +49,7 @@ struct Interval { if (h.max>max) max = h.max; } - + Real length() const; void set_empty() ; bool empty() { return min > max; } Interval() { diff --git a/break.cc b/break.cc index e705c546cf..b8dc1827bc 100644 --- a/break.cc +++ b/break.cc @@ -13,7 +13,7 @@ svec PScore::solve_line(svec curline) const { Spacing_problem sp; - mtor << "line of " << curline.sz() << " cols\n"; + sp.add_column(curline[0], true, 0.0); for (int i=1; i< curline.sz()-1; i++) sp.add_column(curline[i]); @@ -36,8 +36,8 @@ PScore::problem_OK() const PCursor start(cols); PCursor end (((PScore*)this)->cols.bottom()); - assert(start->breakable); - assert(end->breakable); + assert(start->breakable()); + assert(end->breakable()); } struct Col_configuration { @@ -54,10 +54,16 @@ struct Col_configuration { energy = config.last(); config.pop(); } + void print() const { +#ifndef NPRINT + mtor << "energy : " << energy << '\n'; + mtor << "line of " << config.sz() << " cols\n"; +#endif + } }; /// wordwrap type algorithm -/* el stupido. This should be optimised: +/* el stupido. This should be done more accurately: It would be nice to have a Dynamic Programming type of algorithm similar to TeX's @@ -77,8 +83,9 @@ PScore::calc_breaking() Col_configuration minimum; Col_configuration current; - // do another line - current.add(breakpoints[i]->postbreak ); + // do another line + PCol *post = breakpoints[i]->postbreak; + current.add( post); curcol++; // skip the breakable. i++; @@ -92,11 +99,15 @@ PScore::calc_breaking() } current.add(breakpoints[i]->prebreak ); current.setsol(solve_line(current.line)); - mtor << "energy : " << current.energy << '\n'; + current.print(); if (current.energy < minimum.energy) { minimum = current; - } else { + } else { // we're one col too far. + i--; + while (curcol != breakpoints[i]) + curcol --; + break; } diff --git a/calcideal.cc b/calcideal.cc index bddd4f2897..1dc0e1d385 100644 --- a/calcideal.cc +++ b/calcideal.cc @@ -26,13 +26,13 @@ Score::connect_nonmus(PCol* c1, PCol *c2, Real d) do_connect(c1,c2,d); // alert! this is broken! - if (c1->breakable) { + if (c1->breakable()) { do_connect(c1->postbreak, c2,d); } - if (c2->breakable) { + if (c2->breakable()) { do_connect(c1, c2->prebreak,d); } - if (c1->breakable &&c2->breakable) { + if (c1->breakable() &&c2->breakable()) { do_connect(c1->postbreak, c2->prebreak,d); } } @@ -49,8 +49,8 @@ Score::calc_idealspacing() for (; sc.ok(); sc++) { if (sc->musical) for (int i=0; i < sc->durations.sz(); i++) { - Mtime d = sc->durations[i]; - Real dist = duration_to_idealspace(d, paper->whole_width); + Real d = sc->durations[i]; + Real dist = duration_to_idealspace(d, paper_->whole_width); PCol * c2 = find_col(sc->when + d,true)->pcol; connect_nonmus(sc->pcol, c2, dist); c2 = find_col(sc->when + d,false)->pcol; diff --git a/command.cc b/command.cc index 6375c7e6d3..23edf1ec36 100644 --- a/command.cc +++ b/command.cc @@ -5,39 +5,14 @@ bool Command::isbreak()const { - return (code >= BREAK_PRE&&code <= BREAK_END); + return (code >= BREAK_PRE && code <= BREAK_END); } -Command* -get_bar_command(Real w) -{ - Command*c = new Command; - c->when = w; - c->code = TYPESET; - c->args.add( "BAR"); - c->args.add( "|"); - return c; -} - -Command * -get_meter_command(Real w, int n, int m) -{ - Command*c = new Command; - - c->when = w; - c->code = TYPESET; - c->args.add( "METER"); - c->args.add( n ); - c->args.add( m ); - return c; -} - - - Command::Command() { code = NOP; when = -1; + priority=0; } @@ -46,12 +21,19 @@ Command::Command(Real w) { code = NOP; when = w; + priority=0; } + void Command::print() const { - mtor << "command code: " << code << " args: "; - for (int i = 0; i args; + int priority; + + /****************/ + Command(); Command(Real w); bool isbreak()const; diff --git a/debug.cc b/debug.cc index 874937573e..34859a3c9f 100644 --- a/debug.cc +++ b/debug.cc @@ -1,9 +1,10 @@ +#include #include "debug.hh" #include "dstream.hh" #include "vector.hh" Dstream monitor(&cout,".dstreamrc"); - +ostream * nulldev = new ofstream("/dev/null"); void debug_init() { diff --git a/debug.hh b/debug.hh index ca805df011..200585608b 100644 --- a/debug.hh +++ b/debug.hh @@ -9,10 +9,14 @@ #define WARN warnout << "warning: "<<__FUNCTION__ << "(): " extern ostream &warnout ; extern ostream *mlog; +extern ostream *nulldev; extern Dstream monitor; // monitor +#ifdef NPRINT +#define mtor *nulldev +#else #define mtor monitor.identify_as(__PRETTY_FUNCTION__) - +#endif void error(String s); void warning(String s); diff --git a/flower/Makefile b/flower/Makefile index 4533783563..5b40b40629 100644 --- a/flower/Makefile +++ b/flower/Makefile @@ -1,6 +1,6 @@ MAJVER=1 MINVER=0 -PATCHLEVEL=4 +PATCHLEVEL=5 PACKAGENAME=flower VERSION=$(MAJVER).$(MINVER).$(PATCHLEVEL) diff --git a/flower/Sources.make b/flower/Sources.make index fd5dcf4146..e8b2250ad1 100644 --- a/flower/Sources.make +++ b/flower/Sources.make @@ -9,4 +9,5 @@ hh=cursor.hh pcursor.hh lgetopt.hh link.hh list.hh dstream.hh \ string.hh stringutil.hh vray.hh textdb.hh textstr.hh assoc.hh\ findcurs.hh unionfind.hh compare.hh handle.hh matrix.hh\ smat.hh vsmat.hh vector.hh real.hh choleski.hh\ - tsmat.hh tvsmat.hh plist.hh\ + tsmat.hh tvsmat.hh plist.hh associter.hh\ + diff --git a/flower/TODO b/flower/TODO index 6f0f451cce..bcb4e27042 100644 --- a/flower/TODO +++ b/flower/TODO @@ -1,3 +1,4 @@ + * PointerList:List -> PointerList:List * efficient copy cons for List diff --git a/flower/assoc.hh b/flower/assoc.hh index 84a54c9a72..2409985668 100644 --- a/flower/assoc.hh +++ b/flower/assoc.hh @@ -2,6 +2,7 @@ #define ASSOC_HH #include "vray.hh" +#include template struct Assoc_ent_ { @@ -72,4 +73,5 @@ public: }; /** mindblowingly stupid Associative array implementation */ + #endif diff --git a/flower/associter.hh b/flower/associter.hh new file mode 100644 index 0000000000..6103f2266c --- /dev/null +++ b/flower/associter.hh @@ -0,0 +1,42 @@ +/* + associter.hh -- part of flowerlib + + (c) 1996 Han-Wen Nienhuys +*/ + +#ifndef ASSOCITER_HH +#define ASSOCITER_HH + +#include "assoc.hh" + +/// an iterator for the #Assoc# class +template +struct Assoc_iter { + int i; + Assoc &assoc_; + + Assoc_iter(Assoc &a) : + assoc_(a) + { + i= next(0); + } + int next(int j) { + while (j < assoc_.arr.sz() && assoc_.arr[j].free) + j++; + return j; + } + bool ok() const { + return i < assoc_.arr.sz(); + } + void OK()const { + assert(!ok() || !assoc_.arr[i].free); + } + void operator++(int) { i++; i = next(i); } + K key() { return assoc_.arr[i].key; } + V &val() { return assoc_.arr[i].val; } +}; +/* + Iterator + */ + +#endif diff --git a/flower/dstream.cc b/flower/dstream.cc index d8cff69041..8540e734cf 100644 --- a/flower/dstream.cc +++ b/flower/dstream.cc @@ -1,5 +1,5 @@ #include - +#include "assoc.hh" #include "dstream.hh" #include "string.hh" #include "textdb.hh" @@ -36,14 +36,14 @@ Dstream::identify_as(String name) String cl(strip_member(mem)); String idx = cl; - if (silent.elt_query(mem)) + if (silent->elt_query(mem)) idx = mem; - else if (silent.elt_query(cl)) + else if (silent->elt_query(cl)) idx = cl; else { - silent[idx] = false; + (*silent)[idx] = false; } - local_silence = silent[idx]; + local_silence = (*silent)[idx]; if (classname != idx && !local_silence) { classname=idx; *os << "[" << classname << ":]"; @@ -54,9 +54,9 @@ Dstream::identify_as(String name) bool Dstream::silence(String s) { - if (!silent.elt_query(s)) + if (!silent->elt_query(s)) return false; - return silent[s]; + return (*silent)[s]; } /// Dstream & @@ -99,6 +99,7 @@ Dstream::operator<<(String s) Dstream::Dstream(ostream *r, const char * cfg_nm ) { os = r; + silent = new Assoc; if (!os) return; indentlvl = 0; @@ -109,15 +110,18 @@ Dstream::Dstream(ostream *r, const char * cfg_nm ) if (!ifs) return; } - // cerr << "(" << fn; + Text_db cfg(fn); while (! cfg.eof()){ Text_record r( cfg++); assert(r.sz() == 2); - silent[r[0]] = r[1].to_bool(); + (*silent)[r[0]] = r[1].to_bool(); } - // cerr <<")"; -} +} +Dstream::~Dstream() +{ + delete silent; +} diff --git a/flower/dstream.hh b/flower/dstream.hh index 72d0897201..aae52a7838 100644 --- a/flower/dstream.hh +++ b/flower/dstream.hh @@ -4,10 +4,12 @@ #define DSTREAM_HH #include "string.hh" -#include "assoc.hh" const char eol= '\n'; +template +struct Assoc; + /// debug stream class Dstream { @@ -16,7 +18,7 @@ class Dstream bool local_silence; String classname; - Assoc silent; + Assoc *silent; public: bool silence(String); diff --git a/flower/plist.hh b/flower/plist.hh index 3660968a47..8fa126b527 100644 --- a/flower/plist.hh +++ b/flower/plist.hh @@ -44,7 +44,7 @@ class PointerList : public List template -void PL_copy(PointerList &dst,PointerList const&src); +void PL_copy(PointerList &dst,PointerList const&src); #define PL_instantiate(a) L_instantiate(a *); template class PointerList diff --git a/flower/plist.inl b/flower/plist.inl index fb18c87241..b8cd8d6020 100644 --- a/flower/plist.inl +++ b/flower/plist.inl @@ -25,18 +25,17 @@ template inline void PointerList_print( PointerList const & l ) { - List& promises_to_be_const = (List&) l; - for ( Cursor c( promises_to_be_const ); c.ok(); c++ ) - (*c)->print(); + for (PCursor c(l ); c.ok(); c++ ) + c->print(); } template inline void -PL_copy(PointerList &to,PointerList const&src) +PL_copy(PointerList &to,PointerList const&src) { - for (PCursor pc(src); pc.ok(); pc++) { - T q = pc; - T p=new typeof(*q) (*q) ; // argh, how do i do this in ANSI-C++ + for (PCursor pc(src); pc.ok(); pc++) { + T *q = pc; + T *p=new T(*q) ; // argh, how do i do this in ANSI-C++ to.bottom().add(p); } } diff --git a/getcommands.cc b/getcommands.cc new file mode 100644 index 0000000000..1f9362c59c --- /dev/null +++ b/getcommands.cc @@ -0,0 +1,58 @@ +#include "string.hh" +#include "parseconstruct.hh" +#include "command.hh" + +Command* +get_bar_command(Real w) +{ + Command*c = new Command; + c->when = w; + c->code = TYPESET; + c->args.add( "BAR"); + c->args.add( "|"); + c->priority = 100; + return c; +} + +Command * +get_meter_command(Real w, int n, int m) +{ + Command*c = new Command; + + c->when = w; + c->code = TYPESET; + c->args.add( "METER"); + c->args.add( n ); + c->args.add( m ); + c->priority = 50; // less than bar + return c; +} + +Command * +get_meterchange_command(int n, int m) +{ + Command*c = new Command; + + c->code = INTERPRET; + c->args.add( "METER"); + c->args.add( n ); + c->args.add( m ); + c->priority = 0; // more than bar + return c; +} + + +Command * +get_skip_command(int n, Real m) +{ + Command*c = new Command; + + c->code = INTERPRET; + c->args.add( "SKIP"); + c->args.add( n ); + c->args.add( m ); + c->priority = 0; // more than bar + return c; +} + + diff --git a/item.cc b/item.cc index 453200627b..96ec8a890a 100644 --- a/item.cc +++ b/item.cc @@ -54,3 +54,8 @@ Item::Item() output = 0; pstaff_ = 0; } +void +Item::print() const +{ + output->print(); +} diff --git a/item.hh b/item.hh index 6a3a9880d7..484822533b 100644 --- a/item.hh +++ b/item.hh @@ -40,6 +40,7 @@ struct Item { */ String TeXstring () const ; Item(); + void print()const; }; /** An item must be part of a Column */ diff --git a/lexer.l b/lexer.l index 03853ca579..46a30cf752 100644 --- a/lexer.l +++ b/lexer.l @@ -113,9 +113,15 @@ REAL [0-9]+(\.[0-9]*)? mtor << "parens\n"; return YYText()[0]; } +[:] { + char c = YYText()[0]; + mtor << "misc char" <1\vskip2pt\fi \hrule width#2\repeat\vss}\hss}} \def\vcenter#1{\vbox to 0pt{\vss #1\vss}} @@ -50,4 +53,8 @@ \def\cquartrest{\vcenter\quartrest} \def\ceighthrest{\vcenter\eighthrest} \def\csixteenthrest{\vcenter\sixteenthrest} -\def\cthirtysecondrest{\vcenter\thirtysecondrest} \ No newline at end of file +\def\cthirtysecondrest{\vcenter\thirtysecondrest} + +\def\lsingledot{\kern-6pt\singledot} +\def\ldoubledot{\kern-6pt\doubledot} +\def\ltripledot{\kern-6pt\tripledot} \ No newline at end of file diff --git a/lookupsyms.cc b/lookupsyms.cc index 66cbd6db08..14b3ab11e3 100644 --- a/lookupsyms.cc +++ b/lookupsyms.cc @@ -68,8 +68,8 @@ struct Meter_sym:Parametric_symbol { Symbol eval(svec a) const{ Symbol s; - s.dim.x = Interval(0, convert_dimen(10,"pt")); - s.dim.y = Interval(0, convert_dimen(10,"pt") ); + s.dim.x = Interval( convert_dimen(-5,"pt"), convert_dimen(10,"pt")); + s.dim.y = Interval(0, convert_dimen(10,"pt") ); // todo String src = the_sym_tables("param")->lookup("meter").tex; s.tex = substitute_args(src,a); return s; diff --git a/maartje.ly b/maartje.ly index 49665efd4d..508389a12e 100644 --- a/maartje.ly +++ b/maartje.ly @@ -2,7 +2,9 @@ score { -% output "maartje.uit" + paper { + unitspace 3 cm + } rhythmstaff { voice { $ c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 $ } } @@ -11,12 +13,11 @@ score { r2 r4 r1 $ } } - - bar 2 bar 3 - bar 4.5 bar 5 bar 5.5 - bar 6 bar 7 bar 8 - - meter 2 4 4 % after bars. - + commands { + meter 4 4 + skip 3:0 + meter 2 4 + skip 8:0 + } } diff --git a/make_patch b/make_patch index 08f4936b56..c2a1e50f8a 100755 --- a/make_patch +++ b/make_patch @@ -28,4 +28,4 @@ fi #(cd $nm$old; touch depend; make clean) #(cd $nm$new; touch depend; make clean) (cd $nm$new; diff -P -c ../$nm$old . > ../patch-$new) -rm -rf $nm$old +rm -rf $nm$old $nm$new diff --git a/misc.cc b/misc.cc index 2be0f81dd6..3a8658f4a0 100644 --- a/misc.cc +++ b/misc.cc @@ -1,6 +1,6 @@ #include "misc.hh" #include "glob.hh" -#include "mtime.hh" + #include int intlog2(int d) { @@ -26,7 +26,7 @@ const double WHOLE_SPACE = 5.0; // should be settable from input Real -duration_to_idealspace(Mtime d, Real w) +duration_to_idealspace(Real d, Real w) { // see Roelofs, p. 57 return w * pow(ENGRAVERS_SPACE, log2(d)); diff --git a/misc.hh b/misc.hh index a22304267f..0321113242 100644 --- a/misc.hh +++ b/misc.hh @@ -1,7 +1,7 @@ #ifndef MISC_HH #define MISC_HH -#include "mtime.hh" +#include "real.hh" int intlog2(int d); -Real duration_to_idealspace(Mtime d,Real w); +Real duration_to_idealspace(Real d,Real w); #endif diff --git a/molecule.cc b/molecule.cc index 7b8a752423..5ab384f87d 100644 --- a/molecule.cc +++ b/molecule.cc @@ -3,6 +3,13 @@ #include "string.hh" #include "molecule.hh" #include "symbol.hh" +#include "debug.hh" + +void +Atom::print() const +{ + mtor << "texstring: " < c(ats); c.ok(); c++) + c->print(); +} diff --git a/molecule.hh b/molecule.hh index 60a7a05f44..05ec64e3e0 100644 --- a/molecule.hh +++ b/molecule.hh @@ -18,6 +18,7 @@ struct Atom { Box extent() const; Atom(Symbol s); + void print() const; String TeXstring() const; }; @@ -42,6 +43,7 @@ struct Molecule { String TeXstring() const; Molecule(const Molecule&s); + void print() const; private: void operator=(const Molecule&); }; diff --git a/mtime.hh b/mtime.hh deleted file mode 100644 index ef01d2314b..0000000000 --- a/mtime.hh +++ /dev/null @@ -1,8 +0,0 @@ -#ifndef MTIME_HH -#define MTIME_HH - -#include "real.hh" - -typedef Real Mtime; - -#endif diff --git a/parseconstruct.hh b/parseconstruct.hh index fa9f62757d..d2f2c1ac4a 100644 --- a/parseconstruct.hh +++ b/parseconstruct.hh @@ -5,4 +5,8 @@ Staff * get_new_rhythmstaff(); Voice_element * get_note_element(String,String); Voice_element* get_rest_element(String,String); Command * get_bar_command(Real); -Command* get_meter_command(Real, int,int); + +Command* get_meterchange_command( int,int); +Command* get_meter_command( Real,int,int); +Command* get_skip_command( int,Real); + diff --git a/parser.y b/parser.y index d60face970..ebc4c54f8b 100644 --- a/parser.y +++ b/parser.y @@ -7,6 +7,7 @@ #include "score.hh" #include "main.hh" #include "keyword.hh" +#include "scommands.hh" #include "debug.hh" #include "parseconstruct.hh" #include "dimen.hh" @@ -22,7 +23,7 @@ Real real; Command *command; Identifier *id; - + Score_commands *scommands; Voice *voice; Voice_element *el; Staff *staff; @@ -34,7 +35,7 @@ } %token VOICE STAFF SCORE TITLE RHYTHMSTAFF BAR NOTENAME OUTPUT -%token CM IN PT MM PAPER WIDTH METER +%token CM IN PT MM PAPER WIDTH METER UNITSPACE SKIP COMMANDS %type unit %token IDENTIFIER @@ -50,7 +51,7 @@ %type score_block score_body %type staff_block rhythmstaff_block rhythmstaff_body %type int - +%type score_commands_block score_commands_body %% @@ -66,9 +67,16 @@ score_block: SCORE '{' score_body '}' { $$ = $3; } score_body: { $$ = new Score; } | score_body staff_block { $$->add($2); } - | score_body score_command { $$->add($2); } - | score_body paper_block { delete $$->paper; - $$->paper = $2; + | score_body score_commands_block { $$->set($2); } + | score_body paper_block { $$->set($2); } + ; +score_commands_block: + COMMANDS '{' score_commands_body '}' { $$ =$3;} + ; + +score_commands_body: { $$ = new Score_commands; } + | score_commands_body score_command { + $$->parser_add($2); } ; @@ -82,6 +90,7 @@ paper_body: | paper_body OUTPUT STRING { $$->outfile = *$3; delete $3; } + | paper_body UNITSPACE dim { $$->whole_width = $3; } ; dim: @@ -142,13 +151,17 @@ voice_elt: ; score_command: - BAR REAL { - $$ = get_bar_command($2); + SKIP int ':' REAL { + $$ = get_skip_command($2, $4); } - | METER REAL int int { - $$ = get_meter_command($2, $3, $4); + | METER int int { + $$ = get_meterchange_command($2, $3); } +/* | PARTIALMEASURE REAL { + $$ = get_partial_command($2); + }*/ ; + int: REAL { diff --git a/pcol.cc b/pcol.cc index 44c82a938d..1ae06519ac 100644 --- a/pcol.cc +++ b/pcol.cc @@ -5,10 +5,10 @@ void Idealspacing::print() const { - #ifndef NPRINT +#ifndef NPRINT mtor << "idealspacing {" ; mtor << "distance "<print(); + postbreak->print(); + } mtor << "extent: " << width().min << ", " << width().max << "\n"; mtor << "}\n"; #endif @@ -63,7 +68,9 @@ void PCol::OK () const { if (prebreak || postbreak ) { - assert(breakable); + assert(prebreak&&postbreak); + assert(prebreak->daddy == this); + assert(postbreak->daddy == this); } } @@ -71,29 +78,33 @@ PCol::OK () const void PCol::set_breakable() { - if (breakable) + if (breakable()) return; prebreak = new PCol(this); postbreak = new PCol(this); - breakable = true; used = true; } +bool +PCol::breakable() const +{ + return prebreak||postbreak; +} + PCol::PCol(PCol *parent) { daddy = parent; prebreak=0; postbreak=0; - breakable=false; line=0; used = false; } PCol::~PCol() { - if (prebreak) - delete prebreak; // no recursion! - if (postbreak) + + delete prebreak; + delete postbreak; } diff --git a/pcol.hh b/pcol.hh index d11a23ca9c..203482b10e 100644 --- a/pcol.hh +++ b/pcol.hh @@ -12,7 +12,7 @@ struct PCol { List stoppers, starters; /// Can this be broken? true eg. for bars. - bool breakable; + bool breakable()const; /// does this column have items, does it have spacings attached? bool used; diff --git a/proto.hh b/proto.hh index 394f3be14b..ba93e7a526 100644 --- a/proto.hh +++ b/proto.hh @@ -1,6 +1,13 @@ +/* + proto.hh -- part of LilyPond + + (c) 1996 Han-Wen Nienhuys +*/ + +#ifndef PROTO_HH +#define PROTO_HH #include "real.hh" -class Parametric_symbol; class Line_of_score; class Line_of_staff; class PCol; @@ -74,3 +81,10 @@ struct Identifier; struct Keyword; class Mixed_qp; class Paperdef; +class Score_commands; +class Parametric_symbol; + + + +#endif // PROTO_HH + diff --git a/pscore.cc b/pscore.cc index 44a87c0dd4..773554375c 100644 --- a/pscore.cc +++ b/pscore.cc @@ -1,5 +1,6 @@ // utility functions for PScore #include "debug.hh" +#include "molecule.hh" #include "dimen.hh" #include "line.hh" #include "pscore.hh" @@ -11,7 +12,6 @@ PScore::clean_cols() for (PCursor c(cols); c.ok(); ) if (!c->used) { c.del(); - mtor << "removing pcol\n"; } else c++; } @@ -27,15 +27,28 @@ void PScore::typeset_item(Item *i, PCol *c, PStaff *s, int breakstat) { assert(c && i && s); - if (breakstat == 1 ) { - typeset_item(i, c->prebreak, s, 0); - } if (breakstat == 3) - typeset_item(i, c->prebreak, s, 0 ); - else{ - its.bottom().add(i); - s->add(i); - c->add(i); +// assert(!breakstat != 4 || c->breakable() ); + if (breakstat == 0) { + typeset_item(i, c->prebreak, s); + return; } + + if (breakstat == 2) { + typeset_item(i, c->postbreak, s); + return; + } + if (c->daddy && c == c->daddy->prebreak) { // makeshift. + Interval iv (i->width()); + if (!iv.empty()) { + svec col_its (select_items(s, c)); + for (int j =0; j < col_its.sz(); j++) + col_its[j]->output->translate(Offset(-iv.length(),0)); + i->output->translate (Offset(-iv.max, 0)); + } + } + its.bottom().add(i); + s->add(i); + c->add(i); } void @@ -70,7 +83,7 @@ PScore::find_breaks() const { svec retval; for (PCursor c(cols); c.ok(); c++) - if (c->breakable) + if (c->breakable()) retval.add(c); return retval; @@ -84,7 +97,7 @@ PScore::add(PCol *p) PScore::PScore() { - linewidth = convert_dimen(15,"cm"); + linewidth = convert_dimen(15,"cm"); // default } void @@ -115,18 +128,18 @@ PScore::select_items(PStaff*ps , PCol*pc) void PScore::OK()const { +#ifdef NDEBUG for (PCursor cc(cols); cc.ok(); cc++) cc->OK(); for (PCursor ic(suz); ic.ok(); ic++) ic->OK(); - +#endif } void PScore::print() const -{ - - #ifndef NPRINT - mtor << "PScore { width "< cc(cols); cc.ok(); cc++) cc->print(); @@ -135,6 +148,6 @@ PScore::print() const for (PCursor ic(suz); ic.ok(); ic++) ic->print(); mtor << "}\n"; - #endif +#endif } diff --git a/pscore.hh b/pscore.hh index 5ae4c37951..b22582e3f6 100644 --- a/pscore.hh +++ b/pscore.hh @@ -55,7 +55,7 @@ struct PScore { void add(PStaff *); /// add item - void typeset_item(Item *, PCol *,PStaff*,int); + void typeset_item(Item *, PCol *,PStaff*,int=1); /// add to bottom of pcols void add(PCol*); /** diff --git a/request.hh b/request.hh index 79846e7e69..f2dc5f7144 100644 --- a/request.hh +++ b/request.hh @@ -4,7 +4,7 @@ #include "glob.hh" #include "string.hh" -#include "mtime.hh" + struct Request { Voice_element*elt; #if 0 @@ -172,7 +172,7 @@ struct Slur_req : Span_req { /// helper in the hierarchy struct Dynamic { - Mtime subtime; + Real subtime; }; /** Each dynamic is bound to one note ( a crescendo spanning multiple notes is thought to be made of two "dynamics": a start and a stop). diff --git a/rhythmstaf.cc b/rhythmstaf.cc index d2a85d62ce..0b9e90e229 100644 --- a/rhythmstaf.cc +++ b/rhythmstaf.cc @@ -17,11 +17,13 @@ Rhythmic_column::Rhythmic_column(Score_column*s, Rhythmic_staff *rs) staff_ = rs; } - +Rhythmic_staff::Rhythmic_staff() +{ + theline = new Linestaff(1); +} void Rhythmic_staff::set_output(PScore* ps ) { - theline = new Linestaff(1); pscore_ = ps; pscore_->add(theline); } @@ -30,7 +32,7 @@ Rhythmic_staff::set_output(PScore* ps ) void Rhythmic_column::process_commands( ) { - int breakstat = BREAK_END; + int breakstat = BREAK_END - BREAK_PRE; for (int i = 0 ; i < s_commands.sz(); i++) { Command *com = s_commands[i]; switch (com->code){ @@ -41,7 +43,7 @@ Rhythmic_column::process_commands( ) case BREAK_POST: case BREAK_END: score_column->set_breakable(); - breakstat = com->code; + breakstat = com->code- BREAK_PRE; break; case TYPESET: @@ -77,7 +79,6 @@ Rhythmic_column::process_requests() the_note = rq; } break; - } } @@ -136,7 +137,7 @@ Rhythmic_column::typeset_req(Request *rq) m->add_right(dm); } i->output=m; - staff_->pscore_->typeset_item(i, score_column->pcol, staff_->theline,0 ); + staff_->pscore_->typeset_item(i, score_column->pcol, staff_->theline ); } void diff --git a/rhythmstaf.hh b/rhythmstaf.hh index 8e362146e3..69b61ec487 100644 --- a/rhythmstaf.hh +++ b/rhythmstaf.hh @@ -32,11 +32,14 @@ struct Rhythmic_column : Staff_column { struct Rhythmic_staff : Staff { /// indirection to the PStaff. PStaff *theline; + + /****************/ void set_output(PScore *); void process_commands( PCursor &where); void grant_requests(); Staff_column * create_col(Score_column*); + Rhythmic_staff(); }; diff --git a/sccol.cc b/sccol.cc index 28955332d5..1dfc8f2176 100644 --- a/sccol.cc +++ b/sccol.cc @@ -1,7 +1,7 @@ #include "sccol.hh" #include "debug.hh" -Score_column::Score_column(Mtime w) +Score_column::Score_column(Real w) { when = w; pcol = new PCol(0); diff --git a/sccol.hh b/sccol.hh index 9c22c277a1..21a341d17f 100644 --- a/sccol.hh +++ b/sccol.hh @@ -7,19 +7,18 @@ #ifndef SCCOL_HH #define SCCOL_HH #include "pcol.hh" -#include "mtime.hh" struct Score_column { PCol * pcol; - svec durations; - Mtime when; + svec durations; + Real when; /// bool musical; - Score_column(Mtime when); + Score_column(Real when); static int compare(Score_column & c1, Score_column &c2) { return sgn(c1.when - c2.when); diff --git a/scommands.cc b/scommands.cc index 82fe9a1691..8f86ff6fad 100644 --- a/scommands.cc +++ b/scommands.cc @@ -1,5 +1,6 @@ #include "scommands.hh" #include "debug.hh" +#include "parseconstruct.hh" /* maybe it's time for a "narrowing" cursor? @@ -78,45 +79,74 @@ Score_commands::is_breakable(Real w) } return false; } + +void +Score_commands::insert_between(Command victim, PCursor firstc, + PCursor last) +{ + assert(last->when==firstc->when); + PCursor c(firstc+1); + while (c != last) { // hmm what if !last.ok()? + if (victim.priority > c->priority) { + c.insert(new Command(victim)); + return; + } + c++; + } + last.insert(new Command(victim)); + +} void Score_commands::add_command_to_break(Command pre, Command mid,Command post) { Real w = pre.when; - - Command k(w); - - PCursor c ( first(w)); + PCursor c ( first(w)), f(c), l(c); + while (!c->isbreak()) c++; - c.add(new Command(pre)); - + f = c++; while (!c->isbreak()) c++; - c.add(new Command(mid)); - + l = c++; + + insert_between(pre, f, l); + f = l; while (!c->isbreak()) c++; - c.add(new Command(post)); + l = c++; + insert_between(mid, f, l); + f = l; + while (!c->isbreak()) + c++; + l = c++; + insert_between(post, f, l); + assert(l.ok() && l->when ==w && l->code == BREAK_END); } void -Score_commands::add(Command c) +Score_commands::parser_add(Command *c) { - bool encapsulate =false; + bottom().add(c); +} - Command pre(c.when); - Command mid(c.when); - Command post(c.when); +void +Score_commands::process_add(Command c) +{ + bool encapsulate =false; + Real w = c.when; + Command pre(w); + Command mid(w); + Command post(w); if (c.code == TYPESET) { if (c.args[0] == "BAR") { - set_breakable(c.when); + set_breakable(w); encapsulate = true; mid = c; pre = c; } - if (c.args[0] == "METER" && is_breakable(c.when)) { + if (c.args[0] == "METER" && is_breakable(w)) { encapsulate = true; mid = c; pre = c; @@ -146,14 +176,14 @@ Score_commands::clean(Real l) c.code = TYPESET; c.args.add("BAR"); c.args.add("empty"); - add(c); + process_add(c); } PCursor bot(bottom()); while (bot.ok() && bot->when > l) { - - mtor <<"removing "<< bot->code <<" at " << bot->when<<'\n'; + mtor <<"removing "; + bot->print(); bot.del(); bot = bottom(); } @@ -163,7 +193,7 @@ Score_commands::clean(Real l) c.code = TYPESET; c.args.add("BAR"); c.args.add("||"); - add(c); + process_add(c); } OK(); } @@ -173,6 +203,8 @@ Score_commands::OK() const { for (PCursor cc(*this); cc.ok() && (cc+1).ok(); cc++) { assert(cc->when <= (cc+1)->when); + if (cc->when == (cc+1)->when && !cc->isbreak() && !(cc+1)->isbreak()) + assert(cc->priority >= (cc+1)->priority); } } @@ -183,3 +215,47 @@ Score_commands::print() const cc->print(); } } + +Score_commands* +Score_commands::parse(Real l) const +{ + Score_commands*nc = new Score_commands; + int beats_per_meas=4; + Real measlen = 1.0; // 4/4 by default + + Real inbar=0.0; + int barcount=0; + Real wholes=0.0; + Real stoppos=0.0; + + { + Command c(0.0); + c.code = TYPESET; + c.args.add("BAR"); + c.args.add("empty"); + nc->process_add(c); + } + for (PCursor cc(*this); cc.ok() && cc->when <= l; cc++) { + assert (cc->code==INTERPRET); + if (cc->args[0] == "METER") { + beats_per_meas=cc->args[1].value(); + int one_beat =cc->args[2].value (); + measlen = beats_per_meas/Real(one_beat); + nc->process_add(*get_meter_command(wholes,beats_per_meas, one_beat)); + } + if (cc->args[0] == "SKIP") { + stoppos = wholes + cc->args[1].value() * measlen + cc->args[2].fvalue(); + wholes += (measlen-inbar); // skip at least 1 measure + barcount++; + while (wholes <= stoppos) { + nc->process_add(*get_bar_command(wholes)); // liek + wholes += measlen; + barcount ++; + } + wholes = stoppos; + //something + } + } + + return nc; +} diff --git a/scommands.hh b/scommands.hh index 15c844ca65..ee3b4591ab 100644 --- a/scommands.hh +++ b/scommands.hh @@ -9,8 +9,10 @@ #include "vray.hh" #include "list.hh" -struct Score_commands : public PointerList { - void add(Command); +struct Score_commands : public PointerList { + void process_add(Command); + Score_commands*parse(Real last)const; + void parser_add(Command*); void add_seq(svec); void clean(Real last); void set_breakable(Real when); @@ -20,6 +22,9 @@ struct Score_commands : public PointerList { void add_command_to_break(Command pre, Command mid,Command post); void OK() const; void print() const; + Real last() const; + void insert_between(Command victim, PCursor firstc, + PCursor last); }; /** the list of commands in Score. Put in a separate class, since it otherwise clutters the methods of Score. */ diff --git a/score.cc b/score.cc index 0f8bbf70de..3c95fd1790 100644 --- a/score.cc +++ b/score.cc @@ -1,3 +1,4 @@ +#include "scommands.hh" #include "tstream.hh" #include "score.hh" #include "sccol.hh" @@ -6,15 +7,21 @@ #include "debug.hh" #include "paper.hh" +void +Score::set(Paperdef*p) +{ + delete paper_; + paper_ = p; +} void Score::output(String s) { OK(); - if (paper->outfile=="") - paper->outfile = s; + if (paper_->outfile=="") + paper_->outfile = s; - *mlog << "output to " << paper->outfile << "...\n"; - Tex_stream the_output(paper->outfile); + *mlog << "output to " << paper_->outfile << "...\n"; + Tex_stream the_output(paper_->outfile); pscore_->output(the_output); } @@ -22,10 +29,13 @@ Score::output(String s) void Score::process() { - if (!paper) - paper = new Paperdef; - - commands_.clean(last()); + set(commands_->parse(last())); + commands_->print(); + + if (!paper_) + paper_ = new Paperdef; + + commands_->clean(last()); /// distribute commands to disciples distribute_commands(); @@ -72,7 +82,7 @@ Score::clean_cols() */ // todo PCursor -Score::create_cols(Mtime w) +Score::create_cols(Real w) { Score_column* c1 = new Score_column(w); Score_column* c2 = new Score_column(w); @@ -102,7 +112,7 @@ Score::create_cols(Mtime w) } Score_column* -Score::find_col(Mtime w,bool mus) +Score::find_col(Real w,bool mus) { PCursor scc(cols_); for (; scc.ok(); scc++) { @@ -121,7 +131,7 @@ void Score::distribute_commands(void) { for (PCursor sc(staffs_); sc.ok(); sc++) { - sc->add_commands(commands_); + sc->add_commands(*commands_); } } void @@ -140,10 +150,10 @@ Score::do_pcols() pscore_->add(sc->pcol); } } -Mtime +Real Score::last() const { - Mtime l = 0; + Real l = 0; for (PCursor stc(staffs_); stc.ok(); stc++) { l = MAX(l, stc->last()); } @@ -163,7 +173,7 @@ Score::OK() const for (PCursor cc(cols_); cc.ok() && (cc+1).ok(); cc++) { assert(cc->when <= (cc+1)->when); } - commands_.OK(); + commands_->OK(); #endif } @@ -179,7 +189,7 @@ Score::print() const for (PCursor sc(cols_); sc.ok(); sc++) { sc->print(); } - commands_.print(); + commands_->print(); mtor << "}\n"; #endif } @@ -187,10 +197,20 @@ Score::print() const Score::Score() { pscore_=0; - paper = 0; + paper_ = 0; + commands_ = new Score_commands; } + +Score::~Score() +{ + delete pscore_; + delete commands_; + delete paper_; +} + void -Score::add(Command*c) +Score::set(Score_commands*c) { - commands_.add(*c); + delete commands_; + commands_ = c; } diff --git a/score.hh b/score.hh index c6af97c7a1..e58f87f058 100644 --- a/score.hh +++ b/score.hh @@ -1,16 +1,16 @@ #ifndef SCORE_HH #define SCORE_HH - #include "vray.hh" -#include "mtime.hh" -#include "scommands.hh" +#include "proto.hh" +#include "list.hh" + /// the total music def of one movement struct Score { - Paperdef *paper; - /// staffs_ and commands_ form the problem definition. + /// paper_, staffs_ and commands_ form the problem definition. + Paperdef *paper_; PointerList staffs_; - Score_commands commands_; + Score_commands *commands_; /// "runtime" fields for setting up spacing PointerList cols_; @@ -18,27 +18,25 @@ struct Score { /****************************************************************/ - Score(); - void process(); - /// construction void add_staff(Staff *st); + void set(Paperdef*); + Score(); + ~Score(); + void add(Staff*); + void set(Score_commands*); - void OK() const; - Score_column *find_col(Mtime,bool); - void do_pcols(); - void add(Staff*); + void OK() const; + Score_column *find_col(Real,bool); + void process(); void output(String fn); - PCursor create_cols(Mtime); + PCursor create_cols(Real); void print() const; - - Mtime last() const; - - void add(Command*); + Real last() const; private: - + void do_pcols(); void clean_cols(); void distribute_commands(); void do_connect(PCol *c1, PCol *c2, Real d); diff --git a/scores.cc b/scores.cc index cb06b0074f..46685d6050 100644 --- a/scores.cc +++ b/scores.cc @@ -1,5 +1,6 @@ #include "main.hh" #include "score.hh" +#include "string.hh" static svec sv; @@ -11,6 +12,8 @@ do_scores() for (int i=0; i < sv.sz(); i++) { sv[i]->process(); sv[i]->output(outfn); + delete sv[i]; + sv[i] =0; } } diff --git a/staff.cc b/staff.cc index 0827c953f0..7dd2666dc9 100644 --- a/staff.cc +++ b/staff.cc @@ -17,7 +17,7 @@ Staff::clean_cols() } Staff_column * -Staff::get_col(Mtime w, bool mus) +Staff::get_col(Real w, bool mus) { Score_column* sc = score_->find_col(w,mus); assert(sc->when == w); @@ -65,7 +65,7 @@ Staff::setup_staffcols() for (PCursor vc(voices); vc.ok(); vc++) { - Mtime now = vc->start; + Real now = vc->start; for (PCursor ve(vc->elts); ve.ok(); ve++) { Staff_column *sc=get_col(now,true); @@ -130,9 +130,9 @@ Staff::OK() const } -Mtime +Real Staff::last() const { - Mtime l = 0.0; + Real l = 0.0; for (PCursor vc(voices); vc.ok(); vc++) { l = MAX(l, vc->last()); } @@ -154,3 +154,9 @@ Staff::print() const #endif } +Staff::Staff() +{ + score_ =0; + pscore_=0; + +} diff --git a/staff.hh b/staff.hh index cca8c35266..3d39c6e78b 100644 --- a/staff.hh +++ b/staff.hh @@ -19,6 +19,8 @@ struct Staff { Score *score_; PScore *pscore_; + /****************************************************************/ + void add_voice(Voice *v); void add_staff_column(Staff_column *sp); @@ -28,18 +30,13 @@ struct Staff { /** This routines calls virtual functions from Staff, to delegate the interpretation of requests to a derived class of Staff */ - - - /**************************************************************** - VIRTUALS - ****************************************************************/ - void setup_staffcols(); - virtual void set_output(PScore * destination)=0; - virtual void grant_requests()=0; - - Staff_column * get_col(Mtime,bool); + void OK() const; + void print() const; + Real last() const; + void clean_cols() ; + Staff_column * get_col(Real,bool); void add_commands(PointerListconst & sv); /** @@ -48,12 +45,21 @@ struct Staff { PRE sv is time-ordered. */ + + Staff(); + /** + Should construct with Score as arg, but this isn't known during parsing. + */ + /**************************************************************** + VIRTUALS + ****************************************************************/ + + virtual void set_output(PScore * destination)=0; + virtual void grant_requests()=0; virtual Staff_column * create_col(Score_column * )=0; + virtual ~Staff() { } - void OK() const; - void print() const; - Mtime last() const; - void clean_cols() ; - virtual ~Staff() { } }; #endif + + diff --git a/stcol.cc b/stcol.cc index e9a80c8e36..799daed316 100644 --- a/stcol.cc +++ b/stcol.cc @@ -8,7 +8,7 @@ Staff_column::mus() const return score_column->musical; } -Mtime +Real Staff_column::when() const { return score_column->when; @@ -17,7 +17,7 @@ Staff_column::when() const void Staff_column::add(Voice_element*ve) { - Mtime d= ve->duration; + Real d= ve->duration; if (d){ score_column->durations.add(d); } diff --git a/stcol.hh b/stcol.hh index 2b23934c53..060d585fde 100644 --- a/stcol.hh +++ b/stcol.hh @@ -17,7 +17,7 @@ struct Staff_column { svec s_commands; Staff_column(Score_column*s); - bool mus() const ; + bool mus() const; Real when() const; void add(Voice_element*ve); /**************************************************************** diff --git a/suzan.ly b/suzan.ly index 08c4ddf643..59eb0c7489 100644 --- a/suzan.ly +++ b/suzan.ly @@ -2,6 +2,7 @@ score{ rhythmstaff { - voice { $c2 c2 c2 c2$ } + voice { $ c2 c2 c4. c8 c4 c4 c4 c4 c4 c4 c2 c2$ } } + commands { meter 2 4 skip 2:0 meter 4 4 skip 2:0} } diff --git a/symbol.ini b/symbol.ini index 459deb1f67..26c0a31bff 100644 --- a/symbol.ini +++ b/symbol.ini @@ -36,7 +36,7 @@ table param end table dots - 1 \singledot 0pt 4pt -1pt 1pt - 2 \doubledot 0pt 8pt -1pt 1pt - 3 \tripledot 0pt 12pt -1pt 1pt + 1 \lsingledot 0pt 8pt -1pt 1pt + 2 \ldoubledot 0pt 12pt -1pt 1pt + 3 \ltripledot 0pt 16pt -1pt 1pt end diff --git a/table.cc b/table.cc index 72b5ccfd55..da2af9575e 100644 --- a/table.cc +++ b/table.cc @@ -17,6 +17,9 @@ static Keyword_ent the_key_tab[]={ "paper", PAPER, "width", WIDTH, "meter", METER, + "unitspace", UNITSPACE, + "skip", SKIP, + "commands", COMMANDS, 0,0 } ; diff --git a/voice.cc b/voice.cc index 907f229481..ae9342b487 100644 --- a/voice.cc +++ b/voice.cc @@ -51,10 +51,10 @@ Voice_element::print() const #endif } -Mtime +Real Voice::last() const { - Mtime l =start; + Real l =start; for (PCursor vec(elts); vec.ok(); vec++) l += vec->duration; return l; diff --git a/voice.hh b/voice.hh index 35537525ec..b580972b23 100644 --- a/voice.hh +++ b/voice.hh @@ -1,18 +1,18 @@ #ifndef VOICE_HH #define VOICE_HH -#include "mtime.hh" + #include "list.hh" #include "request.hh" /// class for horizontal stuff. struct Voice { PointerList elts; - Mtime start; + Real start; /****************/ - Mtime when(const Voice_element*)const; - Mtime last() const; + Real when(const Voice_element*)const; + Real last() const; Voice(); void add(Voice_element*); void print() const; @@ -30,7 +30,7 @@ struct Voicegroup { /// struct Voice_element { - Mtime duration; + Real duration; const Voicegroup *group; const Voice *voice; PointerList reqs; -- 2.39.2