From: fred Date: Tue, 12 Nov 1996 10:28:39 +0000 (+0000) Subject: lilypond-0.0.9 X-Git-Tag: release/1.5.59~6832 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=072ee265d0d95376d87c87fe4bb4c52289e4c4b8;p=lilypond.git lilypond-0.0.9 --- diff --git a/boxes.cc b/boxes.cc deleted file mode 100644 index ebfc08abfe..0000000000 --- a/boxes.cc +++ /dev/null @@ -1,31 +0,0 @@ -#include "boxes.hh" -#include "const.hh" - -void -Interval::set_empty() { - min = INFTY; - max = -INFTY; -} -Real -Interval::length() const { - return max-min; -} -Box::Box(svec s) -{ - assert(s.sz() == 4); - x.min = s[0]; - x.max = s[1]; - y.min = s[2]; - y.max = s[3]; -} - -Box::Box() -{ -} - -Box::Box(Interval ix, Interval iy) -{ - x = ix; - y = iy; -} - diff --git a/boxes.hh b/boxes.hh deleted file mode 100644 index 5d0be85452..0000000000 --- a/boxes.hh +++ /dev/null @@ -1,83 +0,0 @@ -/* - some 2D geometrical concepts -*/ - -#ifndef BOXES_HH -#define BOXES_HH - -#include "textdb.hh" -#include "real.hh" -#include "vray.hh" - -/// 2d vector -struct Offset { - Real x,y; - - Offset operator+(Offset o)const { - Offset r(*this); - r+=o; - return r; - } - - Offset operator+=(Offset o) { - x+=o.x; - y+=o.y; - return *this; - } - Offset(Real ix , Real iy) { - x=ix; - y=iy; - } - Offset() { - x=0.0; - y=0.0; - } -}; - -/// a Real interval -struct Interval { - Real min, max; - - void translate(Real t) { - min += t; - max += t; - } - - void unite(Interval h) { - if (h.minmax) - max = h.max; - } - Real length() const; - void set_empty() ; - bool empty() { return min > max; } - Interval() { - set_empty(); - } - Interval(Real m, Real M) { - min =m; - max = M; - } -}; - - -/// a 4-tuple of #Real#s -struct Box { - Interval x, y; - - void translate(Offset o) { - x.translate(o.x); - y.translate(o.y); - } - void unite(Box b) { - x.unite(b.x); - y.unite(b.y); - } - Box(svec ); - Box(); - Box(Interval ix, Interval iy); -}; - - -#endif diff --git a/break.cc b/break.cc deleted file mode 100644 index 7d5a02a10e..0000000000 --- a/break.cc +++ /dev/null @@ -1,122 +0,0 @@ -/* - do calculations for breaking problem - - */ -#include "paper.hh" -#include "linespace.hh" -#include "debug.hh" -#include "line.hh" -#include "pscore.hh" - -// construct an appropriate Spacing_problem and solve it. -svec -PScore::solve_line(svec curline) const -{ - Spacing_problem sp; - - sp.add_column(curline[0], true, 0.0); - for (int i=1; i< curline.sz()-1; i++) - sp.add_column(curline[i]); - sp.add_column(curline.last(), true, paper_->linewidth); - - // misschien moeven uit Spacing_problem? - for (PCursor i(suz); i.ok(); i++) { - sp.add_ideal(i); - } - svec the_sol=sp.solve(); - return the_sol; -} - - -void -PScore::problem_OK() const -{ - if (!cols.size()) - error("PScore::problem_OK(): Score does not have any columns"); - PCursor start(cols); - PCursor end (((PScore*)this)->cols.bottom()); - - assert(start->breakable()); - assert(end->breakable()); -} - -struct Col_configuration { - svec line; - svec config; - Real energy; - - Col_configuration() { - energy = INFTY; - } - void add(const PCol*c) { line.add(c);} - void setsol(svec sol) { - config = sol; - 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 done more accurately: - - It would be nice to have a Dynamic Programming type of algorithm - similar to TeX's - - */ - -void -PScore::calc_breaking() -{ - OK(); - problem_OK(); - PCursor curcol(cols); - - svec breakpoints(find_breaks()); - assert(breakpoints.sz()>=2); - for (int i=0 ; i < breakpoints.sz() -1; ) { - Col_configuration minimum; - Col_configuration current; - - // do another line - PCol *post = breakpoints[i]->postbreak; - current.add( post); - curcol++; // skip the breakable. - i++; - - while (i < breakpoints.sz()) { - - // add another measure. - while(breakpoints[i] !=curcol){ - - current.add(curcol); - curcol++; - } - current.add(breakpoints[i]->prebreak ); - current.setsol(solve_line(current.line)); - current.print(); - - if (current.energy < minimum.energy) { - minimum = current; - } else { // we're one col too far. - i--; - while (curcol != breakpoints[i]) - curcol --; - - break; - } - - current.line.last()=breakpoints[i]; - curcol ++; - i++; - } - mtor << "Adding line, next breakpoint " << i << '\n'; - add_line(minimum.line, minimum.config); - } -} - diff --git a/calcideal.cc b/calcideal.cc deleted file mode 100644 index 8099e0e4c7..0000000000 --- a/calcideal.cc +++ /dev/null @@ -1,65 +0,0 @@ -#include "tstream.hh" -#include "score.hh" -#include "pscore.hh" -#include "staff.hh" -#include "paper.hh" -#include "sccol.hh" -#include "debug.hh" - - -void -Score::do_connect(PCol *c1, PCol *c2, Real d) -{ - Idealspacing*sp=pscore_->get_spacing(c1,c2); - - if (!sp->hooke){ - sp->hooke = 1.0; - sp->space =d; - } -} - -void -Score::connect_nonmus(PCol* c1, PCol *c2, Real d) -{ - if (c2->used && c1->used) { - do_connect(c1,c2,d); - - // alert! this is broken! - if (c1->breakable()) { - do_connect(c1->postbreak, c2,d); - } - if (c2->breakable()) { - do_connect(c1, c2->prebreak,d); - } - if (c1->breakable() &&c2->breakable()) { - do_connect(c1->postbreak, c2->prebreak,d); - } - } -} -/* this needs A LOT of rethinking. - - generate springs between columns. - */ -void -Score::calc_idealspacing() -{ - PCursor sc(cols_); - - for (; sc.ok(); sc++) { - if (sc->musical) - for (int i=0; i < sc->durations.sz(); i++) { - Real d = sc->durations[i]; - Real dist = paper_->duration_to_dist(d); - PCol * c2 = find_col(sc->when + d,true)->pcol; - connect_nonmus(sc->pcol, c2, dist); - c2 = find_col(sc->when + d,false)->pcol; - connect_nonmus(sc->pcol, c2, dist); - } - else if (sc->used()) { // ignore empty columns - PCol * c2 = find_col(sc->when,true)->pcol; - connect_nonmus(sc->pcol,c2,0.0); - } - } -} - - diff --git a/command.cc b/command.cc deleted file mode 100644 index 23edf1ec36..0000000000 --- a/command.cc +++ /dev/null @@ -1,39 +0,0 @@ -#include "string.hh" -#include "debug.hh" -#include "command.hh" - -bool -Command::isbreak()const -{ - return (code >= BREAK_PRE && code <= BREAK_END); -} - -Command::Command() -{ - code = NOP; - when = -1; - priority=0; -} - - - -Command::Command(Real w) -{ - code = NOP; - when = w; - priority=0; -} - -void -Command::print() const -{ -#ifndef NPRINT - mtor << "command at " << when << ", code " << code << " prio " << priority; - if (args.sz()) { - mtor<< " args: "; - for (int i = 0; i args; - int priority; - - /****************/ - - Command(); - Command(Real w); - bool isbreak()const; - void print() const; -}; - -/** - A nonrhythmical "thing" in a staff is called a "command". - Commands have these properties: - - \begin{itemize} - \item They are \bf{not} rhythmical, i.e. they do not have a duration - \item They have a staff-wide impact, i.e. a command cannot be targeted at - only one voice in the staff: two voices sharing a staff can't have - different clefs - \item Commands are ordered, that is, when from musical point of view the - commands happen simultaneously, the order in which Staff receives the - commands can still make a difference in the output - \item Some commands are actually score wide, so Score has to issue these - commands to the Staff, eg. BREAK commands - \end{itemize} - - At this moment we have three classes of commands: - \begin{description} - INTERPRET commands are not grouped. - \item[TYPESET] These commands instruct the Staff to - typeset symbols on the output, eg meter/clef/key changes - \item[INTERPRET] These commands do not produce output, instead, - they change the interpretation of other commands or requests. - example: shift output vertically, set the key. - \item[BREAK_XXX] These commands group TYPESET commands in - prebreak and postbreak commands. \See{Col}. - Staff can insert additional commands in a sequence of BREAK_XXX - commands, eg. key change commands - - \end{description} - - These commands are generated by Score, since they have to be the - same for the whole score. - - - \begin{description} - \item[BREAK_PRE] - \item[BREAK_MIDDLE] - \item[BREAK_POST] - \item[BREAK_END] - \item[TYPESET] METER,BAR - \end{description} - - - Commands can be freely copied, they do not have virtual methods. - */ - - -#endif diff --git a/const.hh b/const.hh deleted file mode 100644 index dce593b4a0..0000000000 --- a/const.hh +++ /dev/null @@ -1,12 +0,0 @@ -/* - global constants - */ -#ifndef CONST_HH -#define CONST_HH -#include -#include "real.hh" - -const Real EPS=1e-7; // qlpsolve.hh -const int MAXITER=100; // qlpsolve.hh -const Real INFTY=HUGE; -#endif diff --git a/debug.cc b/debug.cc deleted file mode 100644 index d55c901945..0000000000 --- a/debug.cc +++ /dev/null @@ -1,27 +0,0 @@ -#include -#include -#include "debug.hh" -#include "dstream.hh" -#include "vector.hh" - -Dstream monitor(&cout,".dstreamrc"); -ostream * nulldev = new ofstream("/dev/null"); - - -/* - want to do a stacktrace . - */ -void -mynewhandler() -{ - cerr << "Out of free store memory. Aborting.. "<< flush; - assert(false); -} - - -void -debug_init() -{ - set_new_handler(&mynewhandler); - set_matrix_debug(monitor); -} diff --git a/debug.hh b/debug.hh deleted file mode 100644 index fb3a070593..0000000000 --- a/debug.hh +++ /dev/null @@ -1,28 +0,0 @@ -#ifndef DEBUG_HH -#define DEBUG_HH -#include -#include -#include "dstream.hh" - -void error(String s); // errors - -// warnings -void warning(String s); -#define WARN warnout << "warning: "<<__FUNCTION__ << "(): " -extern ostream &warnout ; - -// progress -extern ostream *mlog; - -// debugging -extern Dstream monitor; // monitor - -#ifdef NPRINT -#define mtor if (0) monitor // clever hack -#else -#define mtor monitor.identify_as(__PRETTY_FUNCTION__) -#endif - - - -#endif diff --git a/dimen.cc b/dimen.cc deleted file mode 100644 index eb53756b45..0000000000 --- a/dimen.cc +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include "dimen.hh" -#include "debug.hh" -#include "string.hh" - -Real -parse_dimen(String dim) -{ - int i=dim.len()-1; - const char *s = dim; - while (i > 0 && (isspace(s[i]) || isalpha(s[i])) ){ - i--; - } - String unit(s + i+1); - return convert_dimen(dim.fvalue(), unit); -} - -const Real CM_TO_PT=72/2.54; - -Real -convert_dimen(Real quant, String unit) -{ - if (unit == "cm") - return quant * CM_TO_PT; - if (unit == "pt") - return quant; - if (unit == "mm") - return quant*CM_TO_PT/10; - if (unit == "in") - return quant * 72; - error ("unknown length unit: `" + unit+"'"); -} - -String -print_dimen(Real r) -{ - String s(r); - s += "pt "; - return s; -} diff --git a/dimen.hh b/dimen.hh deleted file mode 100644 index 4ee17ea140..0000000000 --- a/dimen.hh +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef DIMEN_HH -#define DIMEN_HH - -#include "real.hh" -#include "string.hh" - -Real parse_dimen(String); -Real convert_dimen(Real, String); -String print_dimen(Real); - -#endif - diff --git a/getcommands.cc b/getcommands.cc deleted file mode 100644 index 1f9362c59c..0000000000 --- a/getcommands.cc +++ /dev/null @@ -1,58 +0,0 @@ -#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/glob.hh b/glob.hh deleted file mode 100644 index 7b8bb557d4..0000000000 --- a/glob.hh +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef GLOB_HH -#define GLOB_HH -#include -#include -#include "real.hh" - -#include "proto.hh" -#include "const.hh" -#endif diff --git a/globvars.hh b/globvars.hh deleted file mode 100644 index 8b13789179..0000000000 --- a/globvars.hh +++ /dev/null @@ -1 +0,0 @@ - diff --git a/identifier.cc b/identifier.cc deleted file mode 100644 index 5405d5f710..0000000000 --- a/identifier.cc +++ /dev/null @@ -1,26 +0,0 @@ -#include -#include "identifier.hh" -#include "staff.hh" -#include "lexer.hh" -#include "parser.hh" - -Identifier::Identifier(String n) - :name (n) -{ - data = 0; -} - - -Identifier::~Identifier() -{ -} - -Staff_id::~Staff_id() -{ - delete staff(); -} - -Voice_id::~Voice_id() -{ - delete voice(); -} diff --git a/identifier.hh b/identifier.hh deleted file mode 100644 index 9cb80386c0..0000000000 --- a/identifier.hh +++ /dev/null @@ -1,36 +0,0 @@ - -/* - identifier.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef IDENTIFIER_HH -#define IDENTIFIER_HH -#include "proto.hh" -#include "string.hh" - -struct Identifier -{ - void *data; - String name; - - Identifier(String n) ; - virtual ~Identifier(); - virtual Staff * staff() { assert(false); } - virtual Voice * voice() { assert(false); } -}; - -struct Staff_id : Identifier { - Staff_id(String s, Staff*st):Identifier(s) { data = st; } - virtual Staff* staff() { return (Staff*) data; } - ~Staff_id(); -}; - -struct Voice_id : Identifier { - Voice_id(String s, Voice*st):Identifier(s) { data = st; } - virtual Voice * voice() { return (Voice*)data; } - ~Voice_id(); -}; -#endif // IDENTIFIER_HH - diff --git a/item.cc b/item.cc deleted file mode 100644 index f10187bbb2..0000000000 --- a/item.cc +++ /dev/null @@ -1,52 +0,0 @@ -#include "line.hh" -#include "symbol.hh" -#include "molecule.hh" -#include "pcol.hh" - -void -Item::postprocess() -{ - // default: do nothing -} - - -void -Item::preprocess() -{ - // default: do nothing -} - -String -Item::TeXstring() const -{ - return output->TeXstring(); -} - -Interval -Item::width() const -{ - return output->extent().x; -} - -Interval -Item::height() const -{ - return output->extent().y; -} - -Item::~Item() -{ - delete output; -} - -Item::Item() -{ - col = 0; - output = 0; - pstaff_ = 0; -} -void -Item::print() const -{ - output->print(); -} diff --git a/item.hh b/item.hh deleted file mode 100644 index b450ab59ea..0000000000 --- a/item.hh +++ /dev/null @@ -1,45 +0,0 @@ -#ifndef ITEM_HH -#define ITEM_HH - -#include "glob.hh" -#include "boxes.hh" -#include "string.hh" - -/// a horizontally fixed size element of the score -struct Item { - const PCol * col; - Molecule *output; - - PStaff *pstaff_; - /** needed for knowing at which staff to output this item - */ - - /****************/ - - /// do calculations after determining horizontal spacing - virtual void postprocess(); - - /// do calculations before determining horizontal spacing - virtual void preprocess(); - /** - This is executed directly after the item is added to the - PScore - */ - - virtual Interval width() const; - virtual Interval height() const; - String TeXstring () const ; - Item(); - void print()const; - virtual ~Item(); -}; -/** Item is the datastructure for printables whose width is known - before the spacing is calculated - - NB. This doesn't mean an Item has to initialize the output field before - spacing calculation. - -*/ - - -#endif diff --git a/keyword.cc b/keyword.cc deleted file mode 100644 index 14903cfb61..0000000000 --- a/keyword.cc +++ /dev/null @@ -1,79 +0,0 @@ -/* - keyword.cc -- keywords and identifiers - */ - -#include - -#include "glob.hh" -#include "lexer.hh" -//#include "mudobs.hh" -//#include "gram.hh" - -/* for the keyword table */ -struct Keyword_ent -{ - const char *name; - int tokcode; -}; - -struct Keyword_table -{ - Keyword_ent *table; - int maxkey; - Keyword_table(Keyword_ent *); - int lookup(const char *s) const; -}; - - -/* for qsort */ -int - tabcmp(const void * p1, const void * p2) -{ - return strcmp(((const Keyword_ent *) p1)->name, - ((const Keyword_ent *) p2)->name); -} - -Keyword_table::Keyword_table(Keyword_ent *tab) -{ - table = tab; - - /* count keywords */ - for (maxkey = 0; table[maxkey].name; maxkey++); - - /* sort them */ - qsort(table, maxkey, sizeof(Keyword_ent), tabcmp); -} - -/* - lookup with binsearch, return tokencode. -*/ -int -Keyword_table::lookup(const char *s)const -{ - int lo, - hi, - cmp, - result; - lo = 0; - hi = maxkey; - - /* binary search */ - do - { - cmp = (lo + hi) / 2; - - result = strcmp(s, table[cmp].name); - - if (result < 0) - hi = cmp; - else - lo = cmp; - } - while (hi - lo > 1); - if (!strcmp(s, table[lo].name)) - { - return table[lo].tokcode; - } else - return -1; /* not found */ -} - diff --git a/keyword.hh b/keyword.hh deleted file mode 100644 index df4547ad76..0000000000 --- a/keyword.hh +++ /dev/null @@ -1,14 +0,0 @@ -/* for the keyword table */ -struct Keyword_ent -{ - const char *name; - int tokcode; -}; - -struct Keyword_table -{ - Keyword_ent *table; - int maxkey; - Keyword_table(Keyword_ent *); - int lookup(const char *s) const; -}; diff --git a/lexer.hh b/lexer.hh deleted file mode 100644 index ec7c9b929f..0000000000 --- a/lexer.hh +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef LEXER_HH -#define LEXER_HH - -#include "proto.hh" - -void new_input(String s); -bool close_input(); -int yylex(); -void yyerror(char *s); - -int lookup_keyword(String s); - -Identifier* lookup_identifier(String s); -void add_identifier(Identifier*i); -void delete_identifiers(); -#endif diff --git a/lexer.l b/lexer.l deleted file mode 100644 index 220b07ccf8..0000000000 --- a/lexer.l +++ /dev/null @@ -1,208 +0,0 @@ -%{ // -*-Fundamental-*- - -#include -#include -#include "glob.hh" -#include "string.hh" - -#include "lexer.hh" -#include "keyword.hh" -#include "vray.hh" -#include "parser.hh" -#include "debug.hh" - -sstack include_stack; -static int last_print; -const int DOTPRINT=50; // every 50 lines dots -%} - -%option c++ -%option noyywrap -%option nodefault -%option yylineno -%option debug -%x notes -%x incl -%x quote - -OPTSIGN !? -NOTENAMEI A|B|C|D|E|F|G|As|Bes|Ces|Des|Es|Fes|Ges|Ais|Bis|Cis|Dis|Eis|Fis|Gis -NOTENAMEII a|b|c|d|e|f|g|as|bes|ces|des|es|fes|ges|ais|bis|cis|dis|eis|fis|gis -NOTENAMEIII Ases|Beses|Ceses|Deses|Eses|Feses|Geses|Aisis|Bisis|Cisis|Disis|Eisis|Fisis|Gisis -NOTENAMEIIII ases|beses|ceses|deses|eses|feses|geses|aisis|bisis|cisis|disis|eisis|fisis|gisis -RESTNAME r|s -NOTENAME {NOTENAMEI}|{NOTENAMEII}|{NOTENAMEIII}|{NOTENAMEIIII} -PITCH ['`]*{OPTSIGN}{NOTENAME} -DURNAME 1|2|4|8|16|32 -DURATION {DURNAME}\.* -FULLNOTE {PITCH}{DURATION}? -WORD [a-zA-Z][a-zA-Z0-9_]+ -REAL [0-9]+(\.[0-9]*)? - -%% - -\$ { - BEGIN(notes); return '$'; -} - -{RESTNAME} { - const char *s = YYText(); - yylval.string = new String (s); - mtor << "rest:"<< yylval.string; - return RESTNAME; -} -{PITCH} { - const char *s = YYText(); - yylval.string = new String (s); - mtor << "pitch:"<< *yylval.string; - return PITCH; -} -{DURATION} { - yylval.string = new String (YYText()); - return DURATION; -} -[:space:]+ { -} -[ \t\n]+ { -} -%.* { - -} -\$ { - BEGIN(INITIAL); return '$'; -} -. { - error("lexer error: illegal character found: " + String(YYText())); -} - -\" { - BEGIN(quote); -} -[^\"]* { - yylval.string = new String (YYText()); -} -\" { - BEGIN(INITIAL); - return STRING; -} - -<> { - if(!close_input()) - yyterminate(); -} -{WORD} { - int l = lookup_keyword(YYText()); - if (l != -1) - return l; - Identifier * id = lookup_identifier(YYText()); - if (id) { - yylval.id = id; - return IDENTIFIER; - } - String *sp = new String( YYText()); - mtor << "new id: " << *sp; - yylval.string=sp; - return NEWIDENTIFIER; -} - -{REAL} { - Real r; - int cnv=sscanf (YYText(), "%lf", &r); - assert(cnv == 1); - mtor << "token (REAL)" << r; - yylval.real = r; - return REAL; -} - -[\{\}\[\]\(\)] { - - mtor << "parens\n"; - return YYText()[0]; -} -[:=] { - char c = YYText()[0]; - mtor << "misc char" <set_debug( !monitor.silence("Lexer")); - } - - lexer->switch_streams(newin); -} - - -// pop the inputstack. -bool -close_input() -{ - - istream *closing= include_stack.pop(); - if (closing != &cin) - delete closing; - - cout << "]" << flush; - - if (include_stack.empty()) - return false ; - else - lexer->switch_streams(include_stack.top()); - return true; -} - -int -yylex() { - return lexer->yylex(); -} - -void -yyerror(char *s) -{ - *mlog << "error in line " << lexer->lineno() << ": " << s << '\n'; - exit(1); -} - - -#if 0 - -{NOTENAME} { - yylval.string = new String (YYText()); - return NOTENAME; -} - -#endif diff --git a/line.cc b/line.cc deleted file mode 100644 index 293214dc30..0000000000 --- a/line.cc +++ /dev/null @@ -1,137 +0,0 @@ -#include "line.hh" -#include "dimen.hh" -#include "spanner.hh" -#include "symbol.hh" -#include "paper.hh" -#include "pcol.hh" -#include "pscore.hh" - -static String -make_vbox(Interval i) -{ - - String s("\\vbox to "); - s += print_dimen(i.length()); - s += "{\\vskip "+print_dimen(i.max)+" "; - return s; -} - - -String -Line_of_staff::TeXstring() const -{ - String s("%line_of_staff\n"); - s+=make_vbox(height()); - // the staff itself: eg lines, accolades - s += "\\hbox{"; - { - Symbol sym = pstaff_->get_stafsym(scor->score->paper_->linewidth); - s+=sym.tex; - PCursor cc(scor->cols); - Real lastpos=cc->hpos; - - // all items in the current line & staff. - for (; cc.ok(); cc++) { - Real delta=cc->hpos - lastpos; - lastpos = cc->hpos; - - // moveover - if (delta) - s +=String( "\\kern ") + print_dimen(delta); - - // now output the items. - - for (PCursor ic(cc->its); ic.ok(); ic++) { - if (ic->pstaff_ == pstaff_) - s += ic->TeXstring(); - } - // spanners. - for (PCursor sc(cc->starters); sc.ok(); sc++) - if (sc->pstaff_ == pstaff_) - s += sc->TeXstring(); - } - } - s+="\\hss}\\vss}"; - return s; -} - -Line_of_staff::Line_of_staff(Line_of_score * sc, PStaff*st) -{ - - scor=sc; - pstaff_=st; - - const PCol *linestart= sc->cols.top(); - const PCol *linestop=sc->cols.bottom(); - - for (PCursor sp(pstaff_->spans); sp.ok(); sp++) { - const PCol *brokenstart = &MAX(*linestart, *sp->left); - const PCol *brokenstop = &MIN(*linestop, *sp->right); - - if (*brokenstop < *brokenstart) - brokenspans.bottom().add(sp->broken_at(brokenstop, brokenstart)); - } -} - - -Interval -Line_of_staff::height() const -{ - Interval y; - { - Symbol s = pstaff_->stafsym->eval(scor->score->paper_->linewidth); - y = s.dim.y; - } - PCursor cc(scor->cols); - - // all items in the current line & staff. - for (; cc.ok(); cc++) { - for (PCursor ic(cc->its); ic.ok(); ic++) { - if (ic->pstaff_ == pstaff_) { - y.unite(ic->height()); - } - - // spanners. - for (PCursor sc(cc->starters); sc.ok(); sc++) - if (sc->pstaff_ == pstaff_) - assert(false); - } - } - return y; -} - - -/****************************************************************/ -String -Line_of_score::TeXstring() const -{ - String s("\\vbox{%<- line of score\n"); - for (PCursor sc(staffs); sc.ok(); sc++){ - s += sc->TeXstring(); - if ((sc+1).ok()) - s+= "\\interstaffline\n"; - } - s += "}"; - return s; -} - -/// testing this entry -Line_of_score::Line_of_score(svec sv, - const PScore *ps) -{ - score = ps; - for (int i=0; i< sv.sz(); i++) { - PCol *p=(PCol *) sv[i]; - cols.bottom().add(p); - p->line=this; - } - - for (PCursor sc(score->staffs); sc.ok(); sc++) - staffs.bottom().add(new Line_of_staff(this, sc)); -} -/** construct a line with the named columns. Make the line field - in each column point to this - - #sv# isn't really const!! - */ - diff --git a/line.hh b/line.hh deleted file mode 100644 index 641ddf257d..0000000000 --- a/line.hh +++ /dev/null @@ -1,48 +0,0 @@ -#ifndef LINE_HH -#define LINE_HH - -/* - horizontal structures for broken scores. -*/ - -#include "real.hh" -#include "plist.hh" -#include "vray.hh" -#include "glob.hh" -#include "pstaff.hh" - - - -/// the columns of a score that form one line. -struct -Line_of_score { - List cols; - - // need to store height of each staff. - PointerList staffs; - const PScore * score; // needed to generate staffs - - /****************/ - - Line_of_score(svec sv, const PScore *); - - String TeXstring() const; - - // is #c# contained in #*this#? - bool element(const PCol *c); -}; - -/// one broken line of staff. -struct Line_of_staff { - PointerList brokenspans; - Line_of_score const * scor; - const PStaff *pstaff_; - - /****************/ - - String TeXstring() const; - Line_of_staff(Line_of_score*, PStaff *); - Interval height() const; -}; - -#endif diff --git a/linespace.cc b/linespace.cc deleted file mode 100644 index 17c16ef4ef..0000000000 --- a/linespace.cc +++ /dev/null @@ -1,259 +0,0 @@ -#include -#include "linespace.hh" -#include "debug.hh" -#include "qlp.hh" -#include "unionfind.hh" - -const Real COLFUDGE=1e-3; -//#define COLFUDGE 1e-3 -bool -Spacing_problem::contains(const PCol *w) -{ - for (int i=0; i< cols.sz(); i++) - if (cols[i].col == w) - return true; - return false; -} - -int -Spacing_problem::col_id(const PCol *w)const -{ - for (int i=0; i< cols.sz(); i++) - if (cols[i].col == w) - return i; - assert(false); -} - -void -Spacing_problem::OK() const -{ -#ifndef NDEBUG - Union_find connected(cols.sz()); - - for (int i=0; i < ideals.sz(); i++) { - assert(ideals[i]->hooke > 0); - int l = col_id(ideals[i]->left); - int r = col_id(ideals[i]->right); - connected.connect(l,r); - } - - for (int i = 0; i < cols.sz(); i++) { - assert( connected.equiv(0,i)); - } -#endif -} - -bool -Spacing_problem::check_constraints(Vector v) const -{ - int dim=v.dim(); - // mtor << "checking solution " << v << '\n'; - for (int i=0; i < dim; i++) { - - if (cols[i].fixed&& ABS(cols[i].fixpos - v(i)) > COLFUDGE) { - return false; - } - if (!i) - continue; - - Real mindist=cols[i-1].minright() - +cols[i].minleft(); - - // ugh... compares - Real dif =v(i) - v(i-1)- mindist; - bool b = (dif > - COLFUDGE); - - -#if 1 - if (!b) - return false; - -#else - mtor << "dif= "<fudge= "<< - b << "\n"; - - /* fucks up for unknown reasons */ - if (dif < -COLFUDGE) - return false; -#endif - - } - return true; -} - -bool -Spacing_problem::check_feasible() const -{ - Vector sol(try_initial_solution()); - return check_constraints(sol); -} - -// generate a solution which obeys the min distances and fixed positions -Vector -Spacing_problem::try_initial_solution() const -{ - int dim=cols.sz(); - Vector initsol(dim); - for (int i=0; i < dim; i++) { - if (cols[i].fixed) { - initsol(i)=cols[i].fixpos; - } else { - Real mindist=cols[i-1].minright() - +cols[i].minleft(); - assert(mindist >= 0.0); - initsol(i)=initsol(i-1)+mindist; - - //nog niet - //if (i>0) - // assert(initsol(i) > initsol(i-1)); - } - } - - return initsol; -} -Vector -Spacing_problem::find_initial_solution() const -{ - Vector v(try_initial_solution()); - assert(check_constraints(v)); - return v; -} -// generate the matrices -void -Spacing_problem::make_matrices(Matrix &quad, Vector &lin, Real &c) const -{ - quad.fill(0); - lin.fill(0); - for (int j=0; j < ideals.sz(); j++){ - Idealspacing const*i=ideals[j]; - int l = col_id(i->left); - int r = col_id(i->right); - - quad(r,r) += i->hooke; - quad(r,l) -= i->hooke; - quad(l,r) -= i->hooke; - quad(l,l) += i->hooke; - - lin(r) -= i->space*i->hooke; - lin(l) += i->space*i->hooke; - - c += sqr(i->space); - } -} - -// put the constraints into the LP problem -void -Spacing_problem::make_constraints(Mixed_qp& lp) const -{ - int dim=cols.sz(); - for (int j=0; j < dim; j++) { - Colinfo *c=&(cols[j]); - if (c->fixed) { - lp.add_fixed_var(j,c->fixpos); - } - if (j > 0){ - Vector c1(dim); - - - c1(j)=1.0 ; - c1(j-1)=-1.0 ; - lp.add_inequality_cons(c1, cols[j-1].minright() + - cols[j].minleft()); - } - } -} - -svec -Spacing_problem::solve() const -{ - print(); - OK(); - assert(check_feasible()); - - - /* optimalisatiefunctie */ - Mixed_qp lp(cols.sz()); - make_matrices(lp.quad,lp.lin, lp.const_term); - make_constraints(lp); - Vector start=find_initial_solution(); - Vector sol(lp.solve(start)); - if (!check_constraints(sol)) { - WARN << "solution doesn't satisfy constraints.\n" ; - } - - - svec posns(sol); - posns.add(lp.eval(sol)); - return posns; -} - -/* - add one column to the problem. -*/ -void -Spacing_problem::add_column(const PCol *col, bool fixed, Real fixpos) -{ - Colinfo c; - c.fixed=fixed; - c.fixpos=fixpos; - assert(col); - c.col=col; - cols.add(c); -} - -void -Spacing_problem::add_ideal(const Idealspacing *i) -{ - const PCol *l =i->left; - const PCol *r= i->right; - - if (!contains(l) || !contains(r)) { - return; - } - ideals.add(i); -} - -void -Spacing_problem::print_ideal(const Idealspacing*id)const -{ -#ifndef NPRINT - int l = col_id(id->left); - int r = col_id(id->right); - - mtor << "between " << l <<","<width().max; } - Real minleft()const { return -col->width().min; } -}; - - -/// spacing for one line. -class Spacing_problem { - svec ideals; - svec cols; - - /// the index of #c# in #cols# - int col_id(const PCol *c) const; - - /// generate an (nonoptimal) solution - Vector find_initial_solution() const; - - /// check if problem is too tight - bool check_feasible() const; - /// does #this# contain the column #w#? - bool contains(const PCol *w); - - /// make the energy function - void make_matrices(Matrix &quad, Vector &lin,Real&) const; - - /// generate the LP constraints - void make_constraints(Mixed_qp& lp) const; - -public: - /// solve the spacing problem - svec solve() const; - /** - return the column positions, and the energy (last element) - */ - /// add a idealspacing to the problem. - void add_ideal(const Idealspacing *i); - - /** - One pair of columns can have no, one or more idealspacings, - since they can be "summed" if the columns to which #i# refers are - not in this problem, the spacing is ignored. - */ - - - /// add a col to the problem - void add_column(const PCol *, bool fixed=false, Real fixpos=0.0); - /** columns have to be added left to right. The column contains - info on it's minimum width. - */ - - - bool check_constraints(Vector v) const; - - Vector try_initial_solution() const; - void OK() const; - void print() const; - void print_ideal(const Idealspacing*)const; -}; - - -/** the problem, given by the columns (which include constraints) and - intercolumn spacing. The problem is: - - Generate a spacing which - \begin{itemize} - \item - Satisfies spacing constraints (notes can't be printed through each other) - \item - Looks good, ie tries to conform to an ideal spacing as much as possible. - \end{itemize} - This is converted by regarding idealspacing as "springs" attached - to columns. The equilibrium of one spring is the ideal - distance. The columns have a size, this imposes "hard" constraints - on the distances. This transforms the problem into a quadratic - programming problem with linear constraints. - - The quality is given by the total potential energy in the - springs. The lower the energy, the better the configuration. -*/ -#endif diff --git a/linestaff.cc b/linestaff.cc deleted file mode 100644 index 7cd081dc49..0000000000 --- a/linestaff.cc +++ /dev/null @@ -1,20 +0,0 @@ -#include "linestaff.hh" -#include "symbol.hh" -#include "lookupsyms.hh" -#include "dimen.hh" -#include "paper.hh" -#include "pscore.hh" - -Linestaff::Linestaff(int l, PScore *s) - : PStaff(s) -{ - nolines = l; - stafsym = s->paper_->lookup_->linestaff(l); -} - -Symbol -Linestaff::get_stafsym(Real width)const -{ - String w(print_dimen(width)); - return stafsym->eval(w); -} diff --git a/linestaff.hh b/linestaff.hh deleted file mode 100644 index 891269dd9d..0000000000 --- a/linestaff.hh +++ /dev/null @@ -1,11 +0,0 @@ -#include "pstaff.hh" - -struct Linestaff : PStaff { - - int nolines; - -/****************/ - - Symbol get_stafsym(Real width)const; - Linestaff(int, PScore*); -}; diff --git a/lookupsyms.cc b/lookupsyms.cc deleted file mode 100644 index e6ad52ca5a..0000000000 --- a/lookupsyms.cc +++ /dev/null @@ -1,160 +0,0 @@ -#include "lookupsyms.hh" -#include "debug.hh" -#include "symtable.hh" -#include "dimen.hh" -#include "tex.hh" - -void -Lookup::parse(Text_db&t) -{ - symtables_->read(t) ; -} - -Lookup::Lookup() -{ - symtables_ = new Symtables; -} - -Lookup::~Lookup() -{ - delete symtables_; -} - -Symbol -Lookup::ball(int j) -{ - if (j > 4) - j = 4; - - Symtable * st = (*symtables_)("balls"); - return st->lookup(String(j)); -} - -Symbol -Lookup::rest(int j) -{ - return (*symtables_)("rests")->lookup(String(j)); -} - - -Symbol -Lookup::bar(String s) -{ - return (*symtables_)("bars")->lookup(s); -} - Symbol -Lookup::dots(int j) -{ - if (j>3) - error("max 3 dots"); - return (*symtables_)("dots")->lookup(j); -} - -Symbol -Lookup::flag(int j) -{ - return (*symtables_)("flags")->lookup(j); -} - -Symbol -Lookup::streepjes(int i) -{ - assert(i); - - int arg; - String idx ; - if (i<0) { - idx = "botlines"; - arg = -i; - }else { - arg = i; - idx = "toplines"; - } - Symbol ret = (*symtables_)("streepjes")->lookup(idx); - - svec a; - a.add(arg); - ret.tex = substitute_args(ret.tex, a); - - return ret; -} - -/****************************************************************/ -// bare bones. - -struct Linestaf_symbol : Parametric_symbol { - int lines; - Linestaf_symbol(int n, Symtables*s): Parametric_symbol(s) { lines = n;} - Symbol eval(svec)const; -}; - - -Symbol -Linestaf_symbol::eval(svec w)const -{ - Real wid = w[0].fvalue(); - - Symbol s; - s.dim.x = Interval(0,wid); - Real dy=(lines-1)*convert_dimen(5,"pt"); // TODO! - s.dim.y = Interval(0,dy); - svec a; - a.add(lines); - a.add(w[0]); - s.tex = (*symtables_)("param")->lookup("linestaf").tex; - s.tex = substitute_args(s.tex, a); - return s; -} - -/****************************************************************/ - - -struct Meter_sym:Parametric_symbol { - - Meter_sym(Symtables*s) : Parametric_symbol(s){ } - Symbol eval(svec a) const{ - Symbol s; - s.dim.x = Interval( convert_dimen(-5,"pt"), - convert_dimen(5,"pt")); - s.dim.y = Interval(0, convert_dimen(10,"pt") ); // todo - String src = (*symtables_)("param")->lookup("meter").tex; - s.tex = substitute_args(src,a); - return s; - } -}; -/****************************************************************/ - -struct Stem_sym:Parametric_symbol { - - Stem_sym(Symtables*s) : Parametric_symbol(s) { } - Symbol eval(svec a) const { - Real y1 = a[0].fvalue(); - Real y2 = a[1].fvalue(); - assert(y1 <= y2); - Symbol s; - s.dim.x = Interval(0,0); - s.dim.y = Interval(y1,y2); - - String src = (*symtables_)("param")->lookup("stem").tex; - s.tex = substitute_args(src,a); - return s; - } -}; - -Parametric_symbol * -Lookup::meter(String ) -{ - return new Meter_sym(symtables_); -} - -Parametric_symbol * -Lookup::linestaff(int n) -{ - return new Linestaf_symbol(n,symtables_); -} - -Parametric_symbol* -Lookup::stem() -{ - return new Stem_sym(symtables_); -} diff --git a/lookupsyms.hh b/lookupsyms.hh deleted file mode 100644 index 1ec0d04d10..0000000000 --- a/lookupsyms.hh +++ /dev/null @@ -1,34 +0,0 @@ -/* - lilypond, (c) 1996 Han-Wen Nienhuys -*/ -#ifndef LOOKUPSYMS_HH -#define LOOKUPSYMS_HH - -#include "symbol.hh" - -struct Lookup { - Symtables *symtables_; - - /****************/ - - void parse (Text_db&t); - Parametric_symbol *linestaff(int n); - Parametric_symbol *meter(String); - Parametric_symbol *stem(); - Symbol streepjes(int pos); - /** - pos == 3 : 3 lines above staff (extending below note) - - pos == -3: below staff - */ - - Symbol ball(int); - Symbol flag(int); - Symbol rest(int); - Symbol bar(String); - Symbol dots(int); - Lookup(); - ~Lookup(); -}; - -#endif diff --git a/main.cc b/main.cc deleted file mode 100644 index 3c33fd959d..0000000000 --- a/main.cc +++ /dev/null @@ -1,68 +0,0 @@ -#include -#include -#include "lgetopt.hh" -#include "misc.hh" -#include "string.hh" -#include "main.hh" - -extern void parse_file(String s); - -long_option_init theopts[] = { - 1, "output", 'o', - 0, "warranty", 'w', - 0,0,0 -}; - - -void notice() -{ - cout << - "LilyPond, a music typesetter.\n" - "Copyright (C) 1996 by\n" - " Han-Wen Nienhuys \n" - "\n" - "\n" - " This program is free software; you can redistribute it and/or\n" - "modify it under the terms of the GNU General Public License version 2\n" - "as published by the Free Software Foundation.\n" - "\n" - " This program is distributed in the hope that it will be useful,\n" - "but WITHOUT ANY WARRANTY; without even the implied warranty of\n" - "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n" - "General Public License for more details.\n" - "\n" - " You should have received a copy (refer to the file COPYING) of the\n" - "GNU General Public License along with this program; if not, write to\n" - "the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139,\n" - "USA.\n"; -} - -int -main (int argc, char **argv) -{ - Getopt_long oparser(argc, argv,theopts); - debug_init(); - cout << get_version(); - - while (long_option_init * opt = oparser()) { - switch ( opt->shortname){ - case 'o': - set_default_output(oparser.optarg); - break; - case 'w': - notice(); - exit(0); - break; - default: - assert(false); - break; - } - } - char *arg = oparser.get_next_arg(); - - if (!arg) arg = ""; - parse_file(arg); - - do_scores(); - exit (0); -} diff --git a/main.hh b/main.hh deleted file mode 100644 index 58928f5142..0000000000 --- a/main.hh +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef MAIN_HH -#define MAIN_HH -#include "proto.hh" - -void debug_init(); -void do_scores(); -void add_score(Score * s); -void set_default_output(String s); -const char *get_version(); - -#endif diff --git a/melodicstaff.cc b/melodicstaff.cc deleted file mode 100644 index 2937f45dfe..0000000000 --- a/melodicstaff.cc +++ /dev/null @@ -1,78 +0,0 @@ -#include "melodicstaff.hh" -#include "stem.hh" -#include "notehead.hh" -#include "paper.hh" -#include "molecule.hh" -#include "linestaff.hh" -#include "rhythmstaff.hh" -#include "sccol.hh" - -const int NO_LINES=5; -const int BOTTOM_POSITION=2; // e is on bottom line of 5-staff... - -void -Melodic_staff::set_output(PScore*ps) -{ - theline = new Linestaff(NO_LINES,ps); - Simple_staff::set_output(ps); -} - -void -Melodic_column::typeset_command(Command *com, int breakst) -{ - Molecule*m=create_command_mol(com); - Item *i =new Item; - i->output = m; - typeset_item(i, breakst); -} - -void -Melodic_column::typeset_req(Request *rq) -{ - Item *i ; - if (rq->note()) { - Notehead *n =new Notehead((NO_LINES-1)*2); - n->balltype = rq->rhythmic()->balltype; - n->dots = rq->rhythmic()->dots; - n->position = rq->note()->height() - BOTTOM_POSITION; - i = n; - } else if (rq->rest()) { - i =new Item; - Molecule*m=create_req_mol(rq); - i->output=m; - } - typeset_item(i); -} - - -void -Melodic_column::typeset_stem(Stem_req*rq) -{ - Stem * s = new Stem(NO_LINES); - int n = the_note->note()->height()-BOTTOM_POSITION; - s->minnote =s->maxnote=n; - s->flag = rq->stem_number; - typeset_item(s); -} - -/* - creation - */ -Staff * -get_new_melodicstaff() -{ - return new Melodic_staff; -} - - -Staff_column* -Melodic_staff::create_col(Score_column*s) -{ - return new Melodic_column(s,this); -} - -Melodic_staff* -Melodic_staff::clone()const -{ - return new Melodic_staff(*this); -} diff --git a/melodicstaff.hh b/melodicstaff.hh deleted file mode 100644 index 5c417b84a5..0000000000 --- a/melodicstaff.hh +++ /dev/null @@ -1,32 +0,0 @@ -/* - rhythmstaf.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef MELODICSTAFF_HH -#define MELODICSTAFF_HH - -#include "simplestaff.hh" - -/// five line staff, no multiple voices -struct Melodic_staff : public Simple_staff -{ - Staff_column * create_col(Score_column*); - virtual void set_output(PScore *); - virtual Melodic_staff*clone()const; -}; - -struct Melodic_column : public Simple_column { - virtual void typeset_req(Request *rq); - virtual void typeset_stem(Stem_req *rq); - virtual void typeset_command(Command *, int brs); - // virtual void typeset_item(Item*, int=1); - Melodic_column(Score_column*s,Simple_staff*rs) : - Simple_column(s,rs) { } -// virtual Melodic_column*clone()const; -}; - -#endif // MELODICSTAFF_HH - - diff --git a/misc.cc b/misc.cc deleted file mode 100644 index 54746fd836..0000000000 --- a/misc.cc +++ /dev/null @@ -1,14 +0,0 @@ -#include "misc.hh" -#include "glob.hh" - -#include - -int intlog2(int d) { - int i=0; - while (!(d&1)) { - d/= 2; i++; - } - assert(!(d/2)); - return i; -} - diff --git a/misc.hh b/misc.hh deleted file mode 100644 index 64c8ca4102..0000000000 --- a/misc.hh +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef MISC_HH -#define MISC_HH - - - - -#endif diff --git a/molecule.cc b/molecule.cc deleted file mode 100644 index 8fca34836b..0000000000 --- a/molecule.cc +++ /dev/null @@ -1,127 +0,0 @@ -#include "glob.hh" -#include "dimen.hh" -#include "string.hh" -#include "molecule.hh" -#include "symbol.hh" -#include "debug.hh" - -void -Atom::print() const -{ - mtor << "texstring: " < a; - a.add(print_dimen(off.y)); - a.add(print_dimen(off.x)); - a.add(sym.tex); - return substitute_args(s, a); -} - - -String -Molecule::TeXstring() const -{ - String s; - for(PCursor c(ats); c.ok(); c++) - s+=c->TeXstring(); - return s; -} - -Box -Molecule::extent() const -{ - Box b; - for(PCursor c(ats); c.ok(); c++) - b.unite(c->extent()); - return b; -} - -void -Molecule::translate(Offset o) -{ - for (PCursor c(ats); c.ok(); c++) - c->translate(o); -} - -void -Molecule::add(const Molecule &m) -{ - for (PCursor c(m.ats); c.ok(); c++) { - add(**c); - } -} - -void -Molecule::add_right(const Molecule &m) -{ - Real xof=extent().x.max - m.extent().x.min; - Molecule toadd(m); - toadd.translate(Offset(xof, 0.0)); - add(toadd); -} - -void -Molecule::add_left(const Molecule &m) -{ - Real xof=extent().x.min - m.extent().x.max; - Molecule toadd(m); - toadd.translate(Offset(xof, 0.0)); - add(toadd); -} - - -void -Molecule::add_top(const Molecule &m) -{ - Real yof=extent().y.max - m.extent().y.min; - Molecule toadd(m); - toadd.translate(Offset(0,yof)); - add(toadd); -} - -void -Molecule::add_bot(const Molecule &m) -{ - Real yof=extent().y.min- m.extent().y.max; - Molecule toadd(m); - toadd.translate(Offset(0,yof)); - add(toadd); -} - -void -Molecule::operator = (const Molecule&) -{ - assert(false); -} - -Molecule::Molecule(const Molecule&s) -{ - add(s); -} - -void -Molecule::print() const -{ - for (PCursor c(ats); c.ok(); c++) - c->print(); -} diff --git a/molecule.hh b/molecule.hh deleted file mode 100644 index 0c69f74040..0000000000 --- a/molecule.hh +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef MOLECULE_HH -#define MOLECULE_HH - -#include "plist.hh" -#include "boxes.hh" -#include "item.hh" -#include "symbol.hh" -/// a symbol which can be translated, and freely copied -struct Atom { - Offset off; - Symbol sym; - - void translate(Offset o) { - off += o; - } - - /// how big is #this#? - Box extent() const; - Atom(Symbol s); - - void print() const; - - String TeXstring() const; -}; - -/// a group of #Atom#s -struct Molecule { - PointerList ats; - - Molecule() { } - Molecule(Atom a) { add(a) ; } - - void add_right(const Molecule &m); - void add_left(const Molecule &m); - void add_top(const Molecule &m); - void add_bot(const Molecule &m); - void add(Molecule const &m); - void translate(Offset); - void add(Atom a) { ats.bottom().add(new Atom(a)); } - /// how big is #this#? - Box extent() const; - - String TeXstring() const; - - Molecule(const Molecule&s); - void print() const; -private: - void operator=(const Molecule&); -}; -/** a group of individually translated symbols. You can add molecules - to the top, to the right, etc. */ -#endif diff --git a/note.cc b/note.cc deleted file mode 100644 index b897ce0e66..0000000000 --- a/note.cc +++ /dev/null @@ -1,141 +0,0 @@ -#include -#include "string.hh" -#include "real.hh" -#include "debug.hh" -#include "request.hh" -#include "voice.hh" -#include "notename.hh" - -int default_duration = 4; - -void -parse_duration(const char *a, int &j, int &intdur, int &dots) -{ - String durstr; - while (isdigit(a[j])) - { - durstr += a[j++]; - } - - dots=0; - - while (a[j] == '.') - { - j++; - dots++; - } - intdur = (durstr.len()) ? - durstr.value():default_duration; - - - mtor << "dur " << intdur << "dots " << dots<= 2) { - Stem_req * st = new Stem_req(v, dur); - v->add(st); - } - - int oct, pit, acc; - bool forceacc; - parse_pitch(pitch, i, oct, forceacc, pit, acc); - char nm = pit + 'c'; - if (nm > 'g') - nm += 'a' - 'h'; - rq->name =nm; - - rq->octave = oct; - rq->accidental = acc; - rq->forceacc = forceacc; - rq->balltype = dur; - rq->dots = dots; - - rq->print(); - - v->add(rq); - - return v; -} - -Voice_element * -get_rest_element(String, String durstr) -{ - Voice_element*v = new Voice_element; - int i=0; - - int dur, dots; - parse_duration(durstr, i, dur, dots); - i=0; - - Rest_req * rq = new Rest_req(v); - - rq->balltype = dur; - rq->dots = dots; - rq->print(); - v->add(rq); - return v; -} diff --git a/notehead.cc b/notehead.cc deleted file mode 100644 index fe026b1036..0000000000 --- a/notehead.cc +++ /dev/null @@ -1,67 +0,0 @@ -#include "notehead.hh" -#include "dimen.hh" -#include "debug.hh" -#include "pstaff.hh" -#include "pscore.hh" -#include "paper.hh" -#include "lookupsyms.hh" -#include "molecule.hh" - - -Notehead::Notehead(int ss) -{ - staff_size=ss; - position = 0; - balltype = 0; - dots = 0; -} - -void -Notehead::print()const -{ - mtor << "Head "<pscore_->paper_; - - Real dy = p->interline()/2; - Symbol s = p->lookup_->ball(balltype); - - output = new Molecule(Atom(s)); - if (dots) { - Symbol d = p->lookup_->dots(dots); - Molecule dm; - dm.add(Atom(d)); - if (!(position %2)) - dm.translate(Offset(0,dy)); - output->add_right(dm); - } - bool streepjes = (position<-1)||(position > staff_size+1); - if (streepjes) { - int dir = sgn(position); - int s =(position<-1) ? -((-position)/2): (position-staff_size)/2; - Symbol str = p->lookup_->streepjes(s); - Molecule sm; - sm.add(Atom(str)); - if (position % 2) - sm.translate(Offset(0,-dy* dir)); - output->add(sm); - } - - - output->translate(Offset(0,dy*position)); -} - diff --git a/notehead.hh b/notehead.hh deleted file mode 100644 index b694e95af8..0000000000 --- a/notehead.hh +++ /dev/null @@ -1,38 +0,0 @@ -/* - notehead.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef NOTEHEAD_HH -#define NOTEHEAD_HH -#include "item.hh" - -/// ball at the end of the stem -struct Notehead : public Item -{ - int position; - int staff_size; - int dots; - int balltype; - - /****************/ - void preprocess(); - - Notehead(int staff_size); - /** - position of top line (5 linestaff: 8) - */ - void print()const; -private: - void brew_molecole(); -}; -/** - takes care of: - - * help lines - * proper placing of dots - - */ -#endif // NOTEHEAD_HH - diff --git a/notename.cc b/notename.cc deleted file mode 100644 index 8ebc4df244..0000000000 --- a/notename.cc +++ /dev/null @@ -1,30 +0,0 @@ -#include "glob.hh" -#include "string.hh" - - -/// change this along with lex file for other notenames. -const char *notetab[] = -{ -"ceses", "ces", "c", "cis", "cisis", -"deses", "des", "d", "dis", "disis", -"eses", "es", "e", "eis", "eisis", -"feses", "fes", "f", "fis", "fisis", -"geses", "ges", "g", "gis", "gisis", -"ases", "as", "a", "ais", "aisis", -"beses", "bes", "b", "bis", "bisis", -0 -}; - -void -lookup_notename(int &large, int &small, String s) -{ - int i; - for (i =0; notetab[i]; i++) - if (s == notetab[i]) - { - large = i /5; - small = i %5 - 2; - return; - } - assert(false); -} diff --git a/notename.hh b/notename.hh deleted file mode 100644 index ef04a0da7c..0000000000 --- a/notename.hh +++ /dev/null @@ -1,2 +0,0 @@ - -void lookup_notename(int &large, int &small, String s); diff --git a/paper.cc b/paper.cc deleted file mode 100644 index 89f9a9fe5c..0000000000 --- a/paper.cc +++ /dev/null @@ -1,78 +0,0 @@ -#include - -#include "paper.hh" -#include "debug.hh" -#include "lookupsyms.hh" -#include "dimen.hh" -#include "textdb.hh" - -double log2(double x) { - return log(x) /log(2.0); -} - - -// golden ratio -const Real PHI = (1+sqrt(5))/2; - -// see Roelofs, p. 57 -Real -Paperdef::duration_to_dist(Real d) -{ - return whole_width * pow(geometric_, log2(d)); -} - -Paperdef::Paperdef() -{ - lookup_ = new Lookup(); - parse(); - linewidth = convert_dimen(15,"cm"); // in cm for now - whole_width= 6*note_width(); - geometric_ = PHI; -} - -void -Paperdef::parse() -{ - Text_db symini("symbol.ini"); - - - while (!symini.eof()) { - - Text_record r( symini++); - - if (r[0] == "symboltables") - lookup_->parse(symini); - } -} - -Paperdef::~Paperdef() -{ - delete lookup_; -} - -Real -Paperdef::interline() const -{ - return lookup_->ball(4).dim.y.length(); -} -Real -Paperdef::note_width()const -{ - return lookup_->ball(4).dim.x.length( ); -} -Real -Paperdef::standard_height() const -{ - return convert_dimen(20,"pt"); -} - -void -Paperdef::print() const -{ -#ifndef NPRINT - mtor << "Paper {width: " << print_dimen(linewidth); - mtor << "whole: " << print_dimen(whole_width); - mtor << "out: " < - -#include "lexer.hh" -#include "paper.hh" -#include "staff.hh" -#include "score.hh" -#include "main.hh" -#include "keyword.hh" -#include "scommands.hh" -#include "debug.hh" -#include "parseconstruct.hh" -#include "dimen.hh" -#include "identifier.hh" - -#ifndef NDEBUG -#define YYDEBUG 1 -#endif - -%} - - -%union { - Real real; - Command *command; - Identifier *id; - Score_commands *scommands; - Voice *voice; - Voice_element *el; - Staff *staff; - String *string; - Score *score; - const char *consstr; - Paperdef *paper; - int i; -} - -%token VOICE STAFF SCORE TITLE RHYTHMSTAFF BAR NOTENAME OUTPUT -%token CM IN PT MM PAPER WIDTH METER UNITSPACE SKIP COMMANDS -%token MELODICSTAFF GEOMETRIC START - -%type unit -%token IDENTIFIER -%token NEWIDENTIFIER -%token PITCH DURATION RESTNAME -%token REAL -%token STRING -%type declaration -%type paper_block paper_body -%type dim -%type voice_block voice_body voice_elts voice_elts_dollar -%type voice_elt -%type score_command -%type score_block score_body -%type staff_block rhythmstaff_block rhythmstaff_body -%type melodicstaff_block melodicstaff_body staffdecl -%type int -%type score_commands_block score_commands_body - -%% - -mudela: /* empty */ - | mudela score_block { - add_score($2); - } - | mudela add_declaration { } - ; - -add_declaration: declaration { - add_identifier($1); - } - ; - -declaration: - NEWIDENTIFIER '=' staff_block { - $$ = new Staff_id(*$1, $3); - delete $1; // this sux - } - | NEWIDENTIFIER '=' voice_block { - $$ = new Voice_id(*$1, $3); - delete $1; - } - ; - - -score_block: SCORE '{' score_body '}' { $$ = $3; } - ; - -score_body: { $$ = new Score; } - | score_body staff_block { $$->add($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); - } - ; - -paper_block: - PAPER '{' paper_body '}' { $$ = $3; } - ; - -paper_body: - /* empty */ { $$ = new Paperdef; } - | paper_body WIDTH dim { $$->linewidth = $3;} - | paper_body OUTPUT STRING { $$->outfile = *$3; - delete $3; - } - | paper_body UNITSPACE dim { $$->whole_width = $3; } - | paper_body GEOMETRIC REAL { $$->geometric_ = $3; } - ; - -dim: - REAL unit { $$ = convert_dimen($1,$2); } - ; - - -unit: CM { $$ = "cm"; } - |IN { $$ = "in"; } - |MM { $$ = "mm"; } - |PT { $$ = "pt"; } - ; - -/* - staff -*/ -staff_block: - staffdecl - | rhythmstaff_block - | melodicstaff_block - ; - -staffdecl: STAFF '{' IDENTIFIER '}' { $$ = $3->staff()->clone(); } - ; - -rhythmstaff_block: - RHYTHMSTAFF '{' rhythmstaff_body '}' { $$ = $3; } - ; - -rhythmstaff_body: - /* empty */ { $$ = get_new_rhythmstaff(); } - | rhythmstaff_body voice_block { $$->add_voice($2); } - ; - -melodicstaff_block: - MELODICSTAFF '{' melodicstaff_body '}' { $$ = $3; } - ; - -melodicstaff_body: - /* empty */ { $$ = get_new_melodicstaff(); } - | melodicstaff_body voice_block { $$->add_voice($2); } - ; - -/* - voice -*/ -voice_block: - VOICE '{' voice_body '}' { $$ = $3; } - ; - - -voice_body: - IDENTIFIER { $$ = new Voice(*$1->voice()); } - | voice_elts_dollar { $$ = $1; } - | voice_body START REAL { $$->start = $3; } - ; - - - - -voice_elts_dollar: - '$' voice_elts '$' { $$ = $2; } - ; - -voice_elts: - /* empty */ { - $$ = new Voice; - } - | voice_elts voice_elt { - $$->add($2); - } - ; - -voice_elt: - PITCH DURATION { $$ = get_note_element(*$1, *$2); - - } - | RESTNAME DURATION { $$ = get_rest_element(*$1, *$2); - - } - ; - -score_command: - SKIP int ':' REAL { - $$ = get_skip_command($2, $4); - } - | METER int int { - $$ = get_meterchange_command($2, $3); - } -/* | PARTIALMEASURE REAL { - $$ = get_partial_command($2); - }*/ - ; - - -int: - REAL { - $$ = int($1); - if (ABS($1-Real(int($$))) > 1e-8) - yyerror("expecting integer number"); - - } - ; - -%% - -void -parse_file(String s) -{ - *mlog << "Parsing ... "; -#ifdef YYDEBUG - yydebug = !monitor.silence("Parser"); -#endif - new_input(s); - yyparse(); - delete_identifiers(); - *mlog << "\n"; -} diff --git a/pcol.cc b/pcol.cc deleted file mode 100644 index 1ae06519ac..0000000000 --- a/pcol.cc +++ /dev/null @@ -1,117 +0,0 @@ -#include "pcol.hh" -#include "pstaff.hh" -#include "debug.hh" - -void -Idealspacing::print() const -{ -#ifndef NPRINT - mtor << "idealspacing {" ; - mtor << "distance "<= 0 && left && right); -#endif -} - -/****************************************************************/ - -Interval -PCol::width() const -{ - Interval w; - - for (PCursor ic(its); ic.ok(); ic++) - w.unite(ic->width()); - if (w.empty()) - w.unite(Interval(0,0)); - return w; -} - -void -PCol::print() const -{ - #ifndef NPRINT - mtor << "PCol {"; - mtor << "# symbols: " << its.size() ; - if (breakable()){ - mtor << "pre,post: "; - prebreak->print(); - postbreak->print(); - } - mtor << "extent: " << width().min << ", " << width().max << "\n"; - mtor << "}\n"; - #endif -} - -int -PCol::compare(const PCol &, const PCol &) -{ - assert(false); - return 0 ; -} - -void -PCol::OK () const -{ - if (prebreak || postbreak ) { - assert(prebreak&&postbreak); - assert(prebreak->daddy == this); - assert(postbreak->daddy == this); - } - -} - -void -PCol::set_breakable() -{ - if (breakable()) - return; - - prebreak = new PCol(this); - postbreak = new PCol(this); - used = true; -} - -bool -PCol::breakable() const -{ - return prebreak||postbreak; -} - -PCol::PCol(PCol *parent) { - daddy = parent; - prebreak=0; - postbreak=0; - line=0; - used = false; -} - -PCol::~PCol() -{ - - delete prebreak; - - delete postbreak; -} - -void -PCol::add(const Item *i) -{ - its.bottom().add(i); - used = true; -} - diff --git a/pcol.hh b/pcol.hh deleted file mode 100644 index f28617190a..0000000000 --- a/pcol.hh +++ /dev/null @@ -1,95 +0,0 @@ -#ifndef COLS_HH -#define COLS_HH - -#include "glob.hh" -#include "boxes.hh" -#include "plist.hh" -#include "item.hh" - -/// stuff grouped vertically. -struct PCol { - List its; - List stoppers, starters; - - /// Can this be broken? true eg. for bars. - bool breakable()const; - - /// does this column have items, does it have spacings attached? - bool used; - - /// prebreak is put before end of line. - PCol *prebreak; - /** - if broken here, then (*this) column is discarded, and prebreak - is put at end of line, owned by Col - */ - - /// postbreak at beginning of the new line - PCol *postbreak; - /** \See{prebreak} - */ - PCol *daddy; - /* - if this column is pre or postbreak, then this field points to the parent. - */ - /// if lines are broken then this column is in #line# - const Line_of_score *line; - - /// if lines are broken then this column x-coord #hpos# - Real hpos; - - - /****************************************************************/ - - void add(const Item*i); - - Interval width() const; - ~PCol(); - PCol(PCol * parent); - - /// which col comes first? - static int compare(const PCol &c1, const PCol &c2); - /** - signed compare on columns. - - return < 0 if c1 < c2. - */ - - void OK() const; - void set_breakable(); - void print()const; -}; -/** - This is a class to address items vertically. It contains the data for: - \begin{itemize} - \item - unbroken score - \item - broken score - \item - the linespacing problem - \end{itemize} - */ - -#include "compare.hh" -instantiate_compare(const PCol &, PCol::compare); - - -/// ideal spacing between two columns -struct Idealspacing { - - /// the ideal distance - Real space; - - /// Hooke's constant: how strong are the "springs" attached to columns - Real hooke; - - /// the two columns - const PCol *left, *right; - - void print()const; - void OK() const ; - Idealspacing(const PCol *left,const PCol *right); -}; - -#endif diff --git a/proto.hh b/proto.hh deleted file mode 100644 index 268eda6b53..0000000000 --- a/proto.hh +++ /dev/null @@ -1,90 +0,0 @@ -/* - proto.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef PROTO_HH -#define PROTO_HH -#include "real.hh" - -class Line_of_score; -class Line_of_staff; -class PCol; -class PStaff; -class Staff; -class Staff_column; -class Score; -class Score_column; -class Voice; -class Voice_element; -class Voicegroup; -class Request; -class Command; -class Request; -class Stem_req; -class Span_req; -class Slur_req; -class Decresc_req; -class Cresc_req; -class Bracket_req; -class Script_req; -class Rest_req; -class Note_req; -class Lyric_req; -class Chord; -class Absdynamic_req; -struct Offset; -struct Interval; -struct Box; -struct PCol; -struct Idealspacing; -struct Spanner; -struct Item; -struct Line_of_staff; -struct Colinfo; -struct Linestaff; -struct Atom; -struct Molecule; -struct PScore; -struct Request; -struct Note_req; -struct Lyric_req; -struct Script_req; -struct Rest_req; -struct Rhythmic_req; -struct Chord; -struct Stem_req; -struct Span_req; -struct Beam_req; -struct Bracket_req; -struct Slur_req; -struct Dynamic; -struct Cresc_req; -struct Decresc_req; -struct Absdynamic_req; -struct Score_column; -struct Score; -struct Staff_column; -struct Staff; -struct Command; -struct Symbol; -struct Output; -struct Text_gob; -struct Voice; -struct Voicegroup; -struct Voice_element; -struct String; -struct Tex_stream; -struct Identifier; -struct Keyword; -class Mixed_qp; -class Paperdef; -class Score_commands; -class Parametric_symbol; -struct Lookup; -struct Symtables; -struct Symtable; - -#endif // PROTO_HH - diff --git a/pscore.cc b/pscore.cc deleted file mode 100644 index 3f6f289d26..0000000000 --- a/pscore.cc +++ /dev/null @@ -1,174 +0,0 @@ -// utility functions for PScore -#include "debug.hh" -#include "paper.hh" -#include "molecule.hh" -#include "dimen.hh" -#include "line.hh" -#include "pscore.hh" -#include "tstream.hh" - -void -PScore::clean_cols() -{ - for (PCursor c(cols); c.ok(); ) - if (!c->used) { - c.del(); - } else - c++; -} - - -void -PScore::add(PStaff *s) -{ - staffs.bottom().add(s); -} - -void -PScore::typeset_item(Item *i, PCol *c, PStaff *s, int breakstat) -{ - assert(c && i && s); -// 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); - i->preprocess(); -} - -void -PScore::add_line(svec curline, svec config) -{ - Line_of_score *p = new Line_of_score(curline,this); - lines.bottom().add(p); - for (int i=0; i < curline.sz(); i++){ - PCol *c=(PCol *)curline[i]; // so, this isn't really const. - c->hpos= config[i]; - } -} - -Idealspacing* -PScore::get_spacing(PCol*l, PCol*r) -{ - assert(l!=r); - for (PCursor ic (suz); ic.ok(); ic++) { - if (ic->left == l && ic->right == r){ - return ic; - } - } - - Idealspacing*ip =new Idealspacing(l,r); - suz.bottom().add(ip); - - return ip; -} - -svec -PScore::find_breaks() const -{ - svec retval; - for (PCursor c(cols); c.ok(); c++) - if (c->breakable()) - retval.add(c); - - return retval; -} - -void -PScore::add(PCol *p) -{ - cols.bottom().add(p); -} - -PScore::PScore( Paperdef*p) -{ - paper_ = p; -} - -void -PScore::output(Tex_stream &ts) -{ - int l=1; - - for (PCursor lic(lines); lic.ok(); lic++) { - ts << "% line of score no. " << l++ <<"\n"; - ts << lic->TeXstring(); - if ((lic+1).ok()) - ts << "\\interscoreline\n"; - } -} - -svec -PScore::select_items(PStaff*ps , PCol*pc) -{ - svec ret; - assert(ps && pc); - for (PCursor ic(pc->its); ic.ok(); ic++){ - if (ic->pstaff_ == ps) - ret.add((Item*)(const Item*)ic); - } - return ret; -} - -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 { paper "; - paper_->print(); - mtor << "\ncolumns: "; - for (PCursor cc(cols); cc.ok(); cc++) - cc->print(); - - mtor << "\nideals: "; - for (PCursor ic(suz); ic.ok(); ic++) - ic->print(); - mtor << "}\n"; -#endif -} - -void -PScore::preprocess() -{ -#if 0 - for (PCursor ic(its); ic.ok(); ic++){ - ic->preprocess(); - } -#endif -} - -void -PScore::postprocess() -{ - for (PCursor ic(its); ic.ok(); ic++){ - ic->postprocess(); - } -} diff --git a/pscore.hh b/pscore.hh deleted file mode 100644 index 91436b369e..0000000000 --- a/pscore.hh +++ /dev/null @@ -1,88 +0,0 @@ -// the breaking problem for a score. - -#ifndef PSCORE_HH -#define PSCORE_HH - - -#include "vray.hh" -#include "pcol.hh" -#include "pstaff.hh" - -/// all stuff which goes onto paper -struct PScore { - Paperdef *paper_; // indirection. - - /// the columns, ordered left to right - PointerList cols; - - /// the idealspacings, no particular order - PointerList suz; - - /// the staffs ordered top to bottom - PointerList staffs; - - /// all symbols in score. No particular order. - PointerList its; - - /// if broken, the different lines - PointerList lines; - - /// crescs etc; no particular order - PointerList spanners; - - /****************************************************************/ - - svec select_items(PStaff*, PCol*); - - /// before calc_breaking - void preprocess(); - - void calc_breaking(); - /** - calculate where the lines are to be broken. - - POST - - lines contain the broken lines. - */ - - /// after calc_breaking - void postprocess(); - - /// search all pcols which are breakable. - svec find_breaks() const; - - /// add a line to the broken stuff. Positions given in #config# - void add_line(svec curline, svec config); - - /// helper: solve for the columns in #curline#. - svec solve_line(svec curline) const; - - void add(PStaff *); - /// add item - void typeset_item(Item *, PCol *,PStaff*,int=1); - /// add to bottom of pcols - void add(PCol*); - /** - - */ - void output(Tex_stream &ts); - - Idealspacing* get_spacing(PCol *, PCol *); - /* - get the spacing between c1 and c2, create one if necessary. - */ - - - PCursor find_col(PCol *); - void clean_cols(); - void problem_OK()const ; - void OK()const ; - PScore(Paperdef*); - void print() const; -}; -/** notes, signs, symbols in a score can be grouped in two ways: - horizontally (staffwise), and vertically (columns). #PScore# - contains the items, the columns and the staffs. - */ -#endif diff --git a/pstaff.cc b/pstaff.cc deleted file mode 100644 index 255fceeadd..0000000000 --- a/pstaff.cc +++ /dev/null @@ -1,14 +0,0 @@ -#include "pstaff.hh" - -PStaff::PStaff(PScore*ps) -{ - pscore_=ps; - stafsym = 0; -} - -void -PStaff::add(Item *i ) -{ - its.bottom().add(i); - i->pstaff_ = this; -} diff --git a/pstaff.hh b/pstaff.hh deleted file mode 100644 index bf33c6b437..0000000000 --- a/pstaff.hh +++ /dev/null @@ -1,23 +0,0 @@ -#ifndef PSTAFF_HH -#define PSTAFF_HH - -#include "plist.hh" -#include "item.hh" -#include "symbol.hh" - -/// items grouped vertically. -struct PStaff { - Parametric_symbol *stafsym; - PScore * pscore_; - - virtual Symbol get_stafsym(Real width)const=0; // maybe overkill - - List spans; - List its; - - void add(Item*i); - PStaff(PScore*); - virtual ~PStaff() {} -}; - -#endif diff --git a/qlp.cc b/qlp.cc deleted file mode 100644 index 3dd8e4227e..0000000000 --- a/qlp.cc +++ /dev/null @@ -1,147 +0,0 @@ -#include "debug.hh" -#include "const.hh" -#include "qlp.hh" -#include "choleski.hh" - -void -Mixed_qp::add_equality_cons(Vector , double ) -{ - assert(false); -} - -void -Mixed_qp::add_fixed_var(int i, Real r) -{ - eq_cons.add(i); - eq_consrhs.add(r); -} - -void -Ineq_constrained_qp::add_inequality_cons(Vector c, double r) -{ - cons.add(c); - consrhs.add(r); -} - -Ineq_constrained_qp::Ineq_constrained_qp(int novars): - quad(novars), - lin(novars) -{ -} - -void -Ineq_constrained_qp::OK() const -{ -#ifndef NDEBUG - assert(cons.sz() == consrhs.sz()); - Matrix Qdif= quad - quad.transposed(); - assert(Qdif.norm()/quad.norm() < EPS); -#endif -} - - -Real -Ineq_constrained_qp::eval (Vector v) -{ - return v * quad * v + lin * v + const_term; -} -/* - eliminate appropriate variables, until we have a Ineq_constrained_qp - then solve that. - - PRE - cons should be ascending - */ -Vector -Mixed_qp::solve(Vector start) const -{ - print(); - Ineq_constrained_qp pure(*this); - - for (int i= eq_cons.sz()-1; i>=0; i--) { - pure.eliminate_var(eq_cons[i], eq_consrhs[i]); - start.del(eq_cons[i]); - } - Vector sol = pure.solve(start); - for (int i= 0; i < eq_cons.sz(); i++) { - sol.insert( eq_consrhs[i],eq_cons[i]); - } - return sol; -} - -/* - assume x(idx) == value, and adjust constraints, lin and quad accordingly - */ -void -Ineq_constrained_qp::eliminate_var(int idx, Real value) -{ - Vector row(quad.row(idx)); - row*= value; - - quad.delete_row(idx); - - quad.delete_column(idx); - - lin.del(idx); - row.del(idx); - lin +=row ; - - for (int i=0; i < cons.sz(); i++) { - consrhs[i] -= cons[i](idx) *value; - cons[i].del(idx); - } -} - - - - -Mixed_qp::Mixed_qp(int n) - : Ineq_constrained_qp(n) -{ -} - -void -Mixed_qp::OK() const -{ -#ifndef NDEBUG - Ineq_constrained_qp::OK(); - assert(eq_consrhs.sz() == eq_cons.sz()); -#endif -} -void -Ineq_constrained_qp::print() const -{ -#ifndef NPRINT - mtor << "Quad " << quad; - mtor << "lin " << lin <<"\n"; - for (int i=0; i < cons.sz(); i++) { - mtor << "constraint["<= " << consrhs[i]; - mtor << "\n"; - } -#endif -} -void -Mixed_qp::print() const -{ -#ifndef NPRINT - Ineq_constrained_qp::print(); - for (int i=0; i < eq_cons.sz(); i++) { - mtor << "eq cons "< binding; - for (int i=0; i < cons.sz(); i++) { - Real R=cons[i] * sol- consrhs[i]; - assert(R> -EPS); - if (R < EPS) - binding.add(i); - } - // KKT check... - // todo -} diff --git a/qlp.hh b/qlp.hh deleted file mode 100644 index b539fe6b86..0000000000 --- a/qlp.hh +++ /dev/null @@ -1,89 +0,0 @@ -#ifndef QLP_HH -#define QLP_HH - -#include "matrix.hh" - -/// inequality constrained quadratic program -class Ineq_constrained_qp { - friend class Active_constraints; - - svec cons; - svec consrhs; -public: - Matrix quad; - Vector lin; - Real const_term; - - /// - void assert_solution(Vector sol) const; - /** - use a KKT method to assert optimality of sol - */ - /// solve the problem using a projected gradient method - Vector solve(Vector start) const; - - int dim() const{ - return lin.dim(); - } - /** return the number of variables in the problem */ - /// - void add_inequality_cons(Vector c, double r); - /** - add a constraint - - - c*vars >= r - - PRE - c.dim() == dim(); - - */ - /// - Ineq_constrained_qp(int novars); - /** set up matrices to go with the problem. */ - - Real eval(Vector v); - /** - evaluate the quadratic function for input #v# - */ - - void eliminate_var(int idx, Real value); - void OK()const; - void print() const; - -}; - -/// Quadratic programming with mixed linear constraints -class Mixed_qp :public Ineq_constrained_qp { - svec eq_cons; - svec eq_consrhs; -public: - Mixed_qp(int n); - void OK() const; - void print() const; - - Vector solve(Vector start) const; - void add_fixed_var(int i , Real value); - - /// - void add_equality_cons(Vector c, double r); - /** - add a constraint, - - c*vars == r - - PRE - c.dim()==dim(); - */ - -}; -/** - problem definition of a quadratic optimisation problem with linear - inequality and equality constraints - - - x^T QUAD x /2 + b^T x -*/ - - -#endif diff --git a/qlpsolve.cc b/qlpsolve.cc deleted file mode 100644 index 13bd30e89b..0000000000 --- a/qlpsolve.cc +++ /dev/null @@ -1,255 +0,0 @@ -#include "qlpsolve.hh" -#include "const.hh" -#include "debug.hh" -#include "choleski.hh" - -const Real TOL=1e-2; // roughly 1/10 mm - -String -Active_constraints::status() const -{ - String s("Active|Inactive ["); - for (int i=0; i< active.sz(); i++) { - s += String(active[i]) + " "; - } - - s+="| "; - for (int i=0; i< inactive.sz(); i++) { - s += String(inactive[i]) + " "; - } - s+="]"; - - return s; -} - -void -Active_constraints::OK() { - H.OK(); - A.OK(); - assert(active.sz() +inactive.sz() == opt->cons.sz()); - assert(H.dim() == opt->dim()); - assert(active.sz() == A.rows()); - svec allcons; - - for (int i=0; i < opt->cons.sz(); i++) - allcons.add(0); - for (int i=0; i < active.sz(); i++) { - int j = active[i]; - allcons[j]++; - } - for (int i=0; i < inactive.sz(); i++) { - int j = inactive[i]; - allcons[j]++; - } - for (int i=0; i < allcons.sz(); i++) - assert(allcons[i] == 1); -} - -Vector -Active_constraints::get_lagrange(Vector gradient) -{ - Vector l(A*gradient); - - return l; -} - -void -Active_constraints::add(int k) -{ - // add indices - int cidx=inactive[k]; - active.add(cidx); - - inactive.swap(k,inactive.sz()-1); - inactive.pop(); - - Vector a( opt->cons[cidx] ); - // update of matrices - Vector Ha = H*a; - Real aHa = a*Ha; - if (ABS(aHa) > EPS) { - /* - a != 0, so if Ha = O(EPS), then - Ha * aH / aHa = O(EPS^2/EPS) - - if H*a == 0, the constraints are dependent. - */ - H -= Matrix(Ha , Ha)/(aHa); - - - /* - sorry, don't know how to justify this. .. - */ - Vector addrow(Ha/(aHa)); - A -= Matrix(A*a, addrow); - A.insert_row(addrow,A.rows()); - }else - WARN << "degenerate constraints"; -} - -void -Active_constraints::drop(int k) -{ - int q=active.sz()-1; - - // drop indices - inactive.add(active[k]); - active.swap(k,q); - A.swap_rows(k,q); - active.pop(); - - Vector a(A.row(q)); - if (a.norm() > EPS) { - /* - - */ - H += Matrix(a,a)/(a*opt->quad*a); - A -= A*opt->quad*Matrix(a,a)/(a*opt->quad*a); - }else - WARN << "degenerate constraints"; - Vector rem_row(A.row(q)); - assert(rem_row.norm() < EPS); - A.delete_row(q); -} - - -Active_constraints::Active_constraints(Ineq_constrained_qp const *op) - : A(0,op->dim()), - H(op->dim()), - opt(op) -{ - for (int i=0; i < op->cons.sz(); i++) - inactive.add(i); - Choleski_decomposition chol(op->quad); - H=chol.inverse(); -} - -/* Find the optimum which is in the planes generated by the active - constraints. - */ -Vector -Active_constraints::find_active_optimum(Vector g) -{ - return H*g; -} - -/****************************************************************/ - -int -min_elt_index(Vector v) -{ - Real m=INFTY; int idx=-1; - for (int i = 0; i < v.dim(); i++){ - if (v(i) < m) { - idx = i; - m = v(i); - } - assert(v(i) <= INFTY); - } - return idx; -} - -///the numerical solving -Vector -Ineq_constrained_qp::solve(Vector start) const -{ - Active_constraints act(this); - - - act.OK(); - - - Vector x(start); - Vector gradient=quad*x+lin; - - - Vector last_gradient(gradient); - int iterations=0; - - while (iterations++ < MAXITER) { - Vector direction= - act.find_active_optimum(gradient); - - mtor << "gradient "<< gradient<< "\ndirection " << direction<<"\n"; - - if (direction.norm() > EPS) { - mtor << act.status() << '\n'; - - Real minalf = INFTY; - - Inactive_iter minidx(act); - - - /* - we know the optimum on this "hyperplane". Check if we - bump into the edges of the simplex - */ - - for (Inactive_iter ia(act); ia.ok(); ia++) { - - if (ia.vec() * direction >= 0) - continue; - Real alfa= - (ia.vec()*x - ia.rhs())/ - (ia.vec()*direction); - - if (minalf > alfa) { - minidx = ia; - minalf = alfa; - } - } - Real unbounded_alfa = 1.0; - Real optimal_step = MIN(minalf, unbounded_alfa); - - Vector deltax=direction * optimal_step; - x += deltax; - gradient += optimal_step * (quad * deltax); - - mtor << "step = " << optimal_step<< " (|dx| = " << - deltax.norm() << ")\n"; - - if (minalf < unbounded_alfa) { - /* bumped into an edge. try again, in smaller space. */ - act.add(minidx.idx()); - mtor << "adding cons "<< minidx.idx()<<'\n'; - continue; - } - /*ASSERT: we are at optimal solution for this "plane"*/ - - - } - - Vector lagrange_mult=act.get_lagrange(gradient); - int m= min_elt_index(lagrange_mult); - - if (m>=0 && lagrange_mult(m) > 0) { - break; // optimal sol. - } else if (m<0) { - assert(gradient.norm() < EPS) ; - - break; - } - - mtor << "dropping cons " << m<<'\n'; - act.drop(m); - } - if (iterations >= MAXITER) - WARN<<"didn't converge!\n"; - - mtor << ": found " << x<<" in " << iterations <<" iterations\n"; - assert_solution(x); - return x; -} - -/** Mordecai Avriel, Nonlinear Programming: analysis and methods (1976) - Prentice Hall. - - Section 13.3 - - This is a "projected gradient" algorithm. Starting from a point x - the next point is found in a direction determined by projecting - the gradient onto the active constraints. (well, not really the - gradient. The optimal solution obeying the active constraints is - tried. This is why H = Q^-1 in initialisation) ) - - - */ - diff --git a/qlpsolve.hh b/qlpsolve.hh deleted file mode 100644 index 4d29bcc4a0..0000000000 --- a/qlpsolve.hh +++ /dev/null @@ -1,78 +0,0 @@ -#include "qlp.hh" -#include "matrix.hh" - - -class Active_constraints { - friend class Inactive_iter; - - - Matrix A,H; - svec active; - svec inactive; // actually this is a set, not an array. - const Ineq_constrained_qp *opt; - -public: - String status()const; - - Vector vec(int k) const { return opt->cons[k]; } - Real rhs(int k) const { return opt->consrhs[k]; } - - /// drop constraint - void drop (int k); - /** drop constraint k from the active set. k is the index of the - constraint in #active# - - */ - - /// add constraint j - void add(int j); - /** - add constraint j to the active set j is the index of the - constraint in #inactive# - */ - - /// exchange in and out. - void exchange(int in, int out) { add(in); drop (out); } - - /// - Vector find_active_optimum(Vector g); - - /// get lagrange multipliers. - Vector get_lagrange(Vector v); - - Active_constraints(Ineq_constrained_qp const *op); - /** construct: no constraints active, n vars. Put the equalities - into the constraints. */ - - /// check invariants - void OK(); -}; - -/** - This class represents the set of active (binding) constraints - which can be active while the QLP algorithm is in a feasible - point. The active constraints are numbered. - If the constraints are of the form - - A^T*x >= b - - then the binding constraints are those where the >= is equality. - - */ - -/// -class Inactive_iter { - int j; - Active_constraints const* ac; -public: - Inactive_iter(Active_constraints const &c) { ac=&c; j=0; } - int idx() const { return j; } - void operator ++(int) { j++; } - int constraint_id() const { return ac->inactive[j]; } - Vector vec() const { return ac->vec(constraint_id()); } - Real rhs() const { return ac->rhs(constraint_id()); } - bool ok() const { return j < ac->inactive.sz(); } -}; -/** - loop through the inactive constraints. - */ diff --git a/request.cc b/request.cc deleted file mode 100644 index 35a9ae9718..0000000000 --- a/request.cc +++ /dev/null @@ -1,97 +0,0 @@ -#include "request.hh" -#include "debug.hh" - -#define VIRTUALCONS(T,R) R *T::clone() const { return new T(*this); } struct T -#define RCONS(T) VIRTUALCONS(T, Request) - -RCONS(Rest_req); -RCONS(Rhythmic_req); -RCONS(Stem_req); -RCONS(Note_req); - - -void -Request::print() const -{ -#ifndef NPRINT - mtor << "Req{ unknown }\n"; -#endif -} - -Request::Request(Voice_element*v) -{ - elt = v; -} - -Note_req::Note_req(Voice_element*v) - : Rhythmic_req(v) -{ - name = 'c'; - octave = 0; - accidental = 0; - forceacc = false; -} - -int -Note_req::height() const -{ - int s = name -'c'; - if (s < 0) - s+=7; - return s + octave*7; -} - -Rhythmic_req::Rhythmic_req(Voice_element*v) - :Request(v) -{ - balltype = 1; - dots = 0; -} - -void -Rhythmic_req::print() const -{ - mtor << "rhythmic: " << balltype ; - int d =dots; - while (d--) - mtor << '.'; - mtor<<"\n"; -} - -void -Note_req::print() const -{ - mtor << "note: " << name << " oct: "<< octave; - Rhythmic_req::print(); -} - -Request::Request() -{ - elt = 0; -} - -void -Rest_req::print() const -{ - mtor << "rest, " ; - Rhythmic_req::print(); -} - -Real -wholes(int dur, int dots) -{ - Real f = 1.0/Real(dur); - Real delta = f; - - while (dots--) { - delta /= 2.0; - f += delta; - } - return f; -} - -Real -Rhythmic_req::duration() const { - return wholes( balltype,dots); -} - diff --git a/request.hh b/request.hh deleted file mode 100644 index 04664966b3..0000000000 --- a/request.hh +++ /dev/null @@ -1,223 +0,0 @@ -// LilyPond's second egg of columbus! -#ifndef REQUEST_HH -#define REQUEST_HH - -#include "glob.hh" -#include "string.hh" - -/// a voice element wants something printed -struct Request { - Voice_element*elt; // indirection. - - /****************/ - - virtual void print()const ; - virtual Note_req *note() {return 0;} - virtual Stem_req *stem() {return 0;} - virtual Rest_req *rest() {return 0;} - virtual Rhythmic_req*rhythmic() { return 0;} - Request(Voice_element*); - Request(); - virtual Real duration() const { return 0.0; } - virtual Request* clone() const =0; -}; - -/** - Any Voice_element can do a number of requests. A request is done - to the #Staff# which contains the #Voice_element#. The staff decides - whether to to honor the request, ignore it, or merge it with other - requests. Merging of requests is preferably done with other - requests done by members of the same voicegroups (beams, brackets, stems) - - Please refer to the documentation of the Child classes of - #Request# for explanation of each request type. - - The result of a request will be an #Item# or a #Spanner#, which - will be put on a #PStaff#. Note that the #PStaff# and the original - #Staff# need not have anything in common. For example, the - ``double'' piano Staff could interpret commands which juggle - melodies across the left and right hand, and may put the result in - two five-line PStaffs (maybe with extra PStaffs to carry the dynamic - signs and any lyric. - - The class #Staff# should be thought as a container for the - #Voice#s, and an interpreter for #Request#s and #Command#s. - Different staffs can produce different outputs; a melodious voice - which is put into a percussion-Staff, will be typeset as the rythm of - that voice. - - After #Staff# made up her mind (Would #Staff# be a smart - name? How about #struct Susan {}# :-), the resultant items and - spanners are put on the PScore, and pointers to these items are - stored in the #Voice_element#. This construction enables the - beams/stems to look up the balls it has to connect to. */ - - -/// a request with a duration -struct Rhythmic_req : Request { - int balltype; - int dots; - - /****************/ - - Real duration() const; - Rhythmic_req(Voice_element*); - Rhythmic_req*rhythmic() { return this;} - void print ()const; - Request*clone() const; -}; - -/// Put a note of specified type, height, and with accidental on the staff. -struct Note_req : Rhythmic_req { - char name; - int octave; - int accidental; - bool forceacc; - - /****************/ - - // return height from central c (in halflines) - int height()const; - Note_req(Voice_element*v); - Note_req*note() { return this;} - virtual void print() const; - Request*clone() const; -}; -/** -Staff has to decide if the ball should be hanging left or right. This -influences the horizontal dimensions of a column, and this is why -request processing should be done before horizontal spacing. - -Other voices' frivolities may cause the need for accidentals, so this -is also for the Staff to decide. The Staff can decide on positioning -based on ottava commands and the appropriate clef. -*/ - - -///Put a rest on the staff. -struct Rest_req : Rhythmic_req { - void print()const; - Rest_req(Voice_element*v) : Rhythmic_req(v) { } - Rest_req * rest() { return this;} - Request*clone() const ; -}; -/** -Why a request? It might be a good idea to not typeset the rest, if the paper is too crowded. -*/ - -/// attach a stem to the noteball -struct Stem_req : Request { - /// 4,8,16, .. - int stem_number; - virtual Stem_req *stem() {return this;} - Stem_req(Voice_element*v, int s) : Request(v) { stem_number = s; } - Request*clone() const; -}; - - -#if 0 - -///Put a lyric above or below (?) this staff. -struct Lyric_req : Request { - String text; -}; - - -///Put a script above or below this ``note'' -struct Script_req : Request { - int orientation; - Symbol sym; -}; -/** -eg upbow, downbow. Why a request? These symbols may conflict with slurs and brackets, so this -also a request -*/ - - - - -///Draw a (Guitar) chord above or below this ``note'' -struct Chord : Request { - // don't know how this looks. -}; -/** -Why a request? -Because everything else is done in requests. -*/ - - -/// for absolute dynamics -enum Loudness { - FFF, FF, F, MF, MP, P, PP, PPP -} ; - -/// requests to start or stop something. -struct Span_req : Request { - /// should the spanner start or stop, or is it unwanted? - enum { - NOSPAN, START, STOP - } spantype ; -}; -/** - This type of request typically results in the creation of a #Spanner# -*/ - - -///Start / stop a beam at this note. -struct Beam_req : Span_req { - int nplet; -}; -/** Staff will have to combine this with the stem_request, since the - number of flags that a stem wants to carry will determine the - number of beams. if #nplet# is set, the staff will try to put an - appropriate number over the beam - - [what to do if the nplet fields of start and stop conflict?] - */ - -///Start / stop a slur or a bracket. -struct Bracket_req : Span_req { - int nplet; -}; -/** -Start/stop a bracket at this note. if #nplet# is set, the staff will -try to put an appropriate number over the bracket -*/ - -/// a slur -struct Slur_req : Span_req { - -}; - -/// helper in the hierarchy -struct Dynamic { - 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). - Dynamic changes can occur in a smaller time than the length of its - note, therefore fore each Dynamic request carries a time, measured - from the start of its note. - - This subfield would come in handy, if mpp96 was adapted for midi - support. - - Dynamic should have been derived from request, but I don't want to - fuss with virtual baseclasses. */ - -/// do a crescendo -struct Cresc_req : Span_req, Dynamic { - -}; - -/// do a decrescendo -struct Decresc_req : Span_req, Dynamic { - -}; - -/// do a dynamic like "fff" or "mp" -struct Absdynamic_req : Request, Dynamic { - Loudness loudness; -}; -#endif -#endif diff --git a/rhythmstaff.cc b/rhythmstaff.cc deleted file mode 100644 index 98d17d522c..0000000000 --- a/rhythmstaff.cc +++ /dev/null @@ -1,76 +0,0 @@ -#include "molecule.hh" -#include "notehead.hh" -#include "stem.hh" -#include "linestaff.hh" -#include "rhythmstaff.hh" -#include "paper.hh" -#include "sccol.hh" - - -void -Rhythmic_staff::set_output(PScore*ps) -{ - theline = new Linestaff(1,ps); - Simple_staff::set_output(ps); -} - - -void -Rhythmic_column::typeset_command(Command *com, int breakst) -{ - Item *i =new Item; - Molecule*m = create_command_mol(com); - i->output=m; - m->translate(Offset(0, - -staff_->score_->paper_->standard_height()/2)); - typeset_item(i, breakst); -} - -void -Rhythmic_column::typeset_req(Request *rq) -{ - Item *i ; - if (rq->note()) { - Notehead *n =new Notehead(1); - n->balltype = rq->rhythmic()->balltype; - n->dots = rq->rhythmic()->dots; - n->position = 0; - i = n; - } else if (rq->rest()) { - i =new Item; - Molecule*m=create_req_mol(rq); - i->output=m; - } - typeset_item(i); -} - -void -Rhythmic_column::typeset_stem(Stem_req*rq) -{ - Stem * s = new Stem(0); - s->minnote = s->maxnote = 0; - s->flag = rq->stem_number; - typeset_item(s); -} - -/* - creation - */ -Staff * -get_new_rhythmstaff() -{ - return new Rhythmic_staff; -} - - -Staff_column* -Rhythmic_staff::create_col(Score_column*s) -{ - return new Rhythmic_column(s,this); -} - -Rhythmic_staff* -Rhythmic_staff::clone() const -{ - return new Rhythmic_staff(*this); -} diff --git a/rhythmstaff.hh b/rhythmstaff.hh deleted file mode 100644 index 130f6483b9..0000000000 --- a/rhythmstaff.hh +++ /dev/null @@ -1,36 +0,0 @@ -/* - rhythmstaf.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef RHYTHMSTAF_HH -#define RHYTHMSTAF_HH - -#include "simplestaff.hh" - -/// all notes on one line -struct Rhythmic_staff : public Simple_staff -{ - // Rhythmic_staff(); - Staff_column * create_col(Score_column*); - virtual void set_output(PScore *); - virtual Rhythmic_staff*clone()const; -}; - -/// this does the typesetting -struct Rhythmic_column : public Simple_column { - virtual void typeset_req(Request *rq); - virtual void typeset_stem(Stem_req *rq); - virtual void typeset_command(Command *, int brs); - - -// virtual void typeset_item(Item *rq, int=1); - Rhythmic_column(Score_column*s,Simple_staff*rs) : - Simple_column(s,rs) { } -// virtual Rhythmic_column*clone()const; -}; - -#endif // RHYTHMSTAF_HH - - diff --git a/sccol.cc b/sccol.cc deleted file mode 100644 index 1dfc8f2176..0000000000 --- a/sccol.cc +++ /dev/null @@ -1,28 +0,0 @@ -#include "sccol.hh" -#include "debug.hh" - -Score_column::Score_column(Real w) -{ - when = w; - pcol = new PCol(0); - musical = false; -} - -bool -Score_column::used() { - return pcol->used; -} - -void -Score_column::print() const -{ -#ifndef NPRINT - mtor << "Score_column { mus "<< musical <<" at " << when<<'\n'; - mtor << "durations: ["; - for (int i=0; i < durations.sz(); i++) - mtor << durations[i] << " "; - mtor << "]\n"; - pcol->print(); - mtor << "}\n"; -#endif -} diff --git a/sccol.hh b/sccol.hh deleted file mode 100644 index 21a341d17f..0000000000 --- a/sccol.hh +++ /dev/null @@ -1,45 +0,0 @@ -/* - sccol.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef SCCOL_HH -#define SCCOL_HH -#include "pcol.hh" - - -struct Score_column { - PCol * pcol; - svec durations; - Real when; - - /// - bool musical; - - - Score_column(Real when); - - static int compare(Score_column & c1, Score_column &c2) { - return sgn(c1.when - c2.when); - } - void set_breakable() { - pcol->set_breakable(); - } - bool used(); - void print() const; -}; -/** - - When typesetting hasn't started on PScore yet, 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) - - */ - -instantiate_compare(Score_column&, Score_column::compare); - -#endif // SCCOL_HH - diff --git a/scommands.cc b/scommands.cc deleted file mode 100644 index 8f86ff6fad..0000000000 --- a/scommands.cc +++ /dev/null @@ -1,261 +0,0 @@ -#include "scommands.hh" -#include "debug.hh" -#include "parseconstruct.hh" - -/* - maybe it's time for a "narrowing" cursor? - */ -PCursor -Score_commands::first(Real w) -{ - PCursor pc(*this); - while (pc.ok() && pc->when < w) - pc++; - - return pc; -} - -PCursor -Score_commands::last_insertion(Real w) -{ - PCursor pc(*this); - while (pc.ok() && pc->when <= w) - pc++; - return pc; -} - -void -Score_commands::add_seq(svec com) -{ - if (!com.sz()) - return; - Real when = com[0].when; - - PCursor pc(last_insertion(when)); - for (int i = 0; i < com.sz(); i++) { - Command *c = new Command(com[i]); - assert(com[i].when == when); - if (!pc.ok()) - pc.add(c); - else - pc.insert(c); - } -} - -void -Score_commands::set_breakable(Real when) -{ - bool found_typeset(false); - PCursor cc = first(when); - for (; cc.ok() && cc->when == when; cc++) { - if (cc->isbreak()) - return; - if (cc->code == TYPESET) - found_typeset=true; - } - - assert(!found_typeset); - - svec seq; - Command k(when); - k.code = BREAK_PRE; - seq.add(k); - k.code = BREAK_MIDDLE; - seq.add(k); - k.code = BREAK_POST; - seq.add(k); - k.code = BREAK_END; - seq.add(k); - - add_seq(seq); -} -bool -Score_commands::is_breakable(Real w) -{ - PCursor cc = first(w); - for (; cc.ok() && cc->when == w; cc++) { - if (cc->isbreak()) - return true; - } - 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; - PCursor c ( first(w)), f(c), l(c); - - while (!c->isbreak()) - c++; - f = c++; - while (!c->isbreak()) - c++; - l = c++; - - insert_between(pre, f, l); - f = l; - while (!c->isbreak()) - c++; - 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::parser_add(Command *c) -{ - bottom().add(c); -} - -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(w); - encapsulate = true; - mid = c; - pre = c; - } - if (c.args[0] == "METER" && is_breakable(w)) { - encapsulate = true; - mid = c; - pre = c; - post =c; - } - } - - if (encapsulate) - add_command_to_break(pre, mid, post); - else { - svec seq; - seq.add(c); - add_seq(seq); - } -} - -/* - first and last column should be breakable. - Remove any command past the last musical column. - */ -void -Score_commands::clean(Real l) -{ - assert(l>0); - if (!is_breakable(0.0)) { - Command c(0.0); - c.code = TYPESET; - c.args.add("BAR"); - c.args.add("empty"); - process_add(c); - } - - PCursor bot(bottom()); - - while (bot.ok() && bot->when > l) { - mtor <<"removing "; - bot->print(); - bot.del(); - bot = bottom(); - } - - if (!is_breakable(l)) { - Command c(l); - c.code = TYPESET; - c.args.add("BAR"); - c.args.add("||"); - process_add(c); - } - OK(); -} - -void -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); - } -} - -void -Score_commands::print() const -{ - for (PCursor cc(*this); cc.ok() ; cc++) { - 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 deleted file mode 100644 index 9106f2bfcc..0000000000 --- a/scommands.hh +++ /dev/null @@ -1,33 +0,0 @@ -/* - lilypond, (c) 1996 Han-Wen Nienhuys -*/ -#ifndef SCOMMANDS_HH -#define SCOMMANDS_HH - -#include "proto.hh" -#include "command.hh" -#include "vray.hh" -#include "plist.hh" - -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); - bool is_breakable(Real w); - PCursor last_insertion(Real w); - PCursor first(Real w); - 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. */ - -#endif - diff --git a/score.cc b/score.cc deleted file mode 100644 index 1df13365f2..0000000000 --- a/score.cc +++ /dev/null @@ -1,224 +0,0 @@ -#include "scommands.hh" -#include "tstream.hh" -#include "score.hh" -#include "sccol.hh" -#include "pscore.hh" -#include "staff.hh" -#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; - - *mlog << "output to " << paper_->outfile << "...\n"; - Tex_stream the_output(paper_->outfile); - pscore_->output(the_output); -} - - -void -Score::process() -{ - *mlog << "Processing ... "; - set(commands_->parse(last())); - commands_->print(); - - if (!paper_) - paper_ = new Paperdef; - - commands_->clean(last()); - - /// distribute commands to disciples - distribute_commands(); - - pscore_ = new PScore(paper_); - for (PCursor sc(staffs_); sc.ok(); sc++) { - sc->set_output(pscore_); - sc->process(); - } - - // do this after processing, staffs first have to generate PCols. - do_pcols(); - calc_idealspacing(); - clean_cols(); - OK(); - // print(); - - pscore_->preprocess(); - *mlog << "Calculating ... "; - pscore_->calc_breaking(); - pscore_->postprocess(); - - // TODO: calculate vertical structs - // TODO: calculate mixed structs. - *mlog << "\n"; -} - -// remove empty cols with no spacing attached. -/* should rethink ownership of cols - */ -void -Score::clean_cols() -{ - for (PCursor sc(staffs_); sc.ok(); sc++) - sc->clean_cols(); - - for (PCursor c(cols_); c.ok(); ) { - if (!c->pcol->used) { - mtor << "removing : "; - c->print(); - c.del(); - } else - c++; - } - - pscore_->clean_cols(); -} -/* this sux. We should have Score_column create the appropriate PCol. - Unfortunately, PCols don't know about their position. - */ -// todo -PCursor -Score::create_cols(Real w) -{ - Score_column* c1 = new Score_column(w); - Score_column* c2 = new Score_column(w); - - c1->musical = false; - c2->musical = true; - - PCursor scc(cols_); - - for (; scc.ok(); scc++) { - assert(scc->when != w); - if (scc->when > w) - break; - } - - if (!scc.ok()) { - cols_.bottom().add(c1); - cols_.bottom().add(c2); - scc = cols_.bottom(); - scc --; - } else { - scc.insert(c1); - scc.insert(c2); - scc -= 2; - } - return scc; -} - -Score_column* -Score::find_col(Real w,bool mus) -{ - PCursor scc(cols_); - for (; scc.ok(); scc++) { - if (scc->when == w && scc->musical == mus) - return scc; - if (scc->when > w) - break; - } - scc = create_cols(w); - if (mus) - scc++; - return scc; -} - -void -Score::distribute_commands(void) -{ - for (PCursor sc(staffs_); sc.ok(); sc++) { - sc->add_commands(*commands_); - } -} -void -Score::add(Staff*s) -{ - s->score_ = this; - staffs_.bottom().add(s); -} - - -void -Score::do_pcols() -{ - PCursor sc(cols_); - for (; sc.ok(); sc++) { - pscore_->add(sc->pcol); - } -} -Real -Score::last() const -{ - Real l = 0; - for (PCursor stc(staffs_); stc.ok(); stc++) { - l = MAX(l, stc->last()); - } - return l; -} - -void -Score::OK() const -{ -#ifndef NDEBUG - for (PCursor sc(staffs_); sc.ok(); sc++) { - sc->OK(); - assert(sc->score_ == this); - } - staffs_.OK(); - cols_.OK(); - for (PCursor cc(cols_); cc.ok() && (cc+1).ok(); cc++) { - assert(cc->when <= (cc+1)->when); - } - commands_->OK(); -#endif -} - - -void -Score::print() const -{ -#ifndef NPRINT - mtor << "score {\n"; - for (PCursor sc(staffs_); sc.ok(); sc++) { - sc->print(); - } - for (PCursor sc(cols_); sc.ok(); sc++) { - sc->print(); - } - commands_->print(); - mtor << "}\n"; -#endif -} - -Score::Score() -{ - pscore_=0; - paper_ = 0; - commands_ = new Score_commands; -} - -Score::~Score() -{ - delete pscore_; - delete commands_; - delete paper_; -} - -void -Score::set(Score_commands*c) -{ - delete commands_; - commands_ = c; -} diff --git a/score.hh b/score.hh deleted file mode 100644 index 176d7fa47a..0000000000 --- a/score.hh +++ /dev/null @@ -1,52 +0,0 @@ -#ifndef SCORE_HH -#define SCORE_HH -#include "vray.hh" -#include "proto.hh" -#include "plist.hh" - - -/// the total music def of one movement -struct Score { - /// paper_, staffs_ and commands_ form the problem definition. - Paperdef *paper_; - PointerList staffs_; - Score_commands *commands_; - - /// "runtime" fields for setting up spacing - PointerList cols_; - PScore *pscore_; - - /****************************************************************/ - - /// 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(Real,bool); - void process(); - void output(String fn); - PCursor create_cols(Real); - void print() const; - Real last() const; - -private: - void do_pcols(); - void clean_cols(); - void distribute_commands(); - void do_connect(PCol *c1, PCol *c2, Real d); - void connect_nonmus(PCol* c1, PCol *c2, Real d); - /// add #Idealspacings# to #pscore_# - void calc_idealspacing(); - /** add the score wide commands (bars, breaks) to each staff so - they can process (typeset) them if needed */ -}; -/** - - */ -#endif diff --git a/scores.cc b/scores.cc deleted file mode 100644 index 04efd6e4b1..0000000000 --- a/scores.cc +++ /dev/null @@ -1,34 +0,0 @@ -#include "main.hh" -#include "score.hh" -#include "string.hh" - -static svec sv; - -static String outfn="lelie.uit"; - -// todo: check we don't overwrite default output. - -void -do_scores() -{ - for (int i=0; i < sv.sz(); i++) { - sv[i]->process(); - sv[i]->output(outfn); - delete sv[i]; - sv[i] =0; - } -} - -void -add_score(Score * s) -{ - sv.add(s); -} - - -void -set_default_output(String s) -{ - outfn = s; -} - diff --git a/simpleprint.cc b/simpleprint.cc deleted file mode 100644 index b069978dce..0000000000 --- a/simpleprint.cc +++ /dev/null @@ -1,75 +0,0 @@ -#include "lookupsyms.hh" -#include "request.hh" -#include "pscore.hh" -#include "paper.hh" -#include "simplestaff.hh" -#include "molecule.hh" -#include "sccol.hh" - -Molecule * -Simple_column::create_req_mol(Request *rq) -{ - assert(rq->rest()); - Symbol s; - int dots=0; - if (rq->rest()) - s = staff_->paper()->lookup_->rest(rq->rest()->balltype); - - if (rq->rhythmic()) - dots=rq->rhythmic()->dots; - - - Molecule *m = new Molecule(Atom(s)); - if (dots) { - Symbol d = staff_->paper()->lookup_->dots(dots); - Molecule dm; - dm.add(Atom(d)); - m->add_right(dm); - } - return m; -} - -Molecule * -Simple_column::create_command_mol(Command *com) -{ - Symbol s; - - if (com -> args[0] == "BAR" ) { - s = staff_->paper()->lookup_->bar(com->args[1]); - } else if (com->args[0] == "METER") { - Parametric_symbol *p = staff_->paper()->lookup_->meter("general"); - svec arg( com->args); - arg.del(0); - s = p->eval(arg); - } else - assert(false); - - Molecule * m =new Molecule(Atom(s)); - { - Interval wid; - svec sv(staff_->pscore_-> - select_items(staff_->theline, score_column->pcol)); - for (int j=0; joutput->extent().x); - } - if (!wid.empty()) - m->translate(Offset(wid.max,0)); - } - - return m; -} - -void -Simple_column::typeset_item(Item *i, int breakst) -{ - // ugh - staff_->pscore_->typeset_item(i, score_column->pcol, - staff_->theline,breakst); -} - -void -Simple_staff::set_output(PScore* ps ) -{ - pscore_ = ps; - pscore_->add(theline); -} diff --git a/simplestaff.cc b/simplestaff.cc deleted file mode 100644 index 97250b48cb..0000000000 --- a/simplestaff.cc +++ /dev/null @@ -1,91 +0,0 @@ -#include "request.hh" -#include "debug.hh" -#include "staff.hh" -#include "command.hh" -#include "simplestaff.hh" -#include "sccol.hh" - - - - -Simple_column::Simple_column(Score_column*s, Simple_staff *rs) - : Staff_column(s) -{ - the_note = 0; - stem_ = 0; - staff_ = rs; -} - -Simple_staff::Simple_staff() -{ - theline = 0; -} - -void -Simple_column::process_commands( ) -{ - int breakstat = BREAK_END - BREAK_PRE; - for (int i = 0 ; i < s_commands.sz(); i++) { - Command *com = s_commands[i]; - switch (com->code){ - case INTERPRET: - break; - case BREAK_PRE: - case BREAK_MIDDLE: - case BREAK_POST: - case BREAK_END: - score_column->set_breakable(); - breakstat = com->code- BREAK_PRE; - break; - - case TYPESET: - typeset_command ( com , breakstat); - break; - default : - break; - } - } -} -/** - accept: - - BREAK: all - TYPESET: bar, meter, - - */ - - - -void -Simple_column::process_requests() -{ - for (int i = 0 ; i < v_elts.sz(); i ++) - for (PCursor rqc(v_elts[i]->reqs); rqc.ok(); rqc++) { - Request *rq= rqc; - if (rq->rhythmic()){ - if (the_note){ - WARN << "too many notes.\n"; - } - the_note = rq; - - } - if (rq->stem()) { - stem_ = rq->stem(); - } - - } -} - -void -Simple_staff::grant_requests() -{ - for (PCursor cc(cols); cc.ok(); cc++) { - Simple_column *rp = (Simple_column*)*cc; - if (rp->the_note) - rp->typeset_req( rp->the_note); - if (rp->stem_) - rp->typeset_stem(rp->stem_->stem()); - } -} - - diff --git a/simplestaff.hh b/simplestaff.hh deleted file mode 100644 index c965765adb..0000000000 --- a/simplestaff.hh +++ /dev/null @@ -1,61 +0,0 @@ -/* - simplestaff.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef SIMPLESTAFF_HH -#define SIMPLESTAFF_HH - -#include "stcol.hh" -#include "staff.hh" -/* - mega-stupido staffs and cols: they do notes one at each moment. - */ - -struct Simple_staff; - -/// column of Simple_staff: store one request -struct Simple_column : Staff_column { - - Request *the_note; - Stem_req *stem_; - - Simple_staff* staff_; - - /****************/ - virtual void typeset_stem(Stem_req *rq)=0; - virtual void typeset_req(Request *rq)=0; - virtual void typeset_command(Command *, int brs)=0; - virtual void typeset_item(Item *, int=1); - - Molecule *create_command_mol(Command *com); - Molecule *create_req_mol(Request *rq); - void take_request(Request *rq); - - virtual void process_commands( ); - virtual void process_requests(); - - Simple_column(Score_column*s,Simple_staff*rs); -}; - - -/// Simple staff: one note at a time -struct Simple_staff : Staff { - /// indirection to the PStaff. - PStaff *theline; - - /****************/ - virtual void set_output(PScore *); - - void process_commands( PCursor &where); - void grant_requests(); -// virtual Staff*clone()const; - - Simple_staff(); -}; - -#endif // SIMPLESTAFF_HH - - - diff --git a/spanner.cc b/spanner.cc deleted file mode 100644 index be30c04659..0000000000 --- a/spanner.cc +++ /dev/null @@ -1,33 +0,0 @@ - -#include "spanner.hh" -#include "line.hh" - -#include "symbol.hh" -#include "molecule.hh" -#include "pcol.hh" - -String -Spanner::TeXstring() const -{ - assert(right->line); - Real w = left->hpos - right->hpos; - return strets->eval(w).tex; -} - -// todo. -Spanner * -Spanner::broken_at(const PCol *c1, const PCol *c2) const -{ - Spanner *sp = new Spanner(*this); - sp->left = c1; - sp->right = c2; - return sp; -} - -Spanner::Spanner() -{ - pstaff_=0; - strets=0; - left = right = 0; -} - diff --git a/spanner.hh b/spanner.hh deleted file mode 100644 index 1908d2f013..0000000000 --- a/spanner.hh +++ /dev/null @@ -1,34 +0,0 @@ -/* - spanner.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef SPANNER_HH -#define SPANNER_HH -#include "proto.hh" - -/// a symbol which is attached between two columns. -struct Spanner { - const PCol *left, *right; - Parametric_symbol *strets; - PStaff * pstaff_; - /// clone a piece of this spanner. - virtual Spanner *broken_at(const PCol *c1, const PCol *c2) const; - /** - - PRE - c1 >= start, c2 <= stop - */ - /****************/ - String TeXstring () const ; - Spanner(); - virtual void process(); -}; -/** Spanner should know about the items which it should consider: - e.g. slurs should be steep enough to "enclose" all those items. This - is absolutely necessary for beams, since they have to adjust the - length of stems of notes they encompass. - - */ -#endif diff --git a/src/leastsquares.cc b/src/leastsquares.cc new file mode 100644 index 0000000000..1e1c91cee3 --- /dev/null +++ b/src/leastsquares.cc @@ -0,0 +1,25 @@ +#include "leastsquares.hh" + +void +Least_squares::minimise(Real &coef, Real &offset) +{ + Real sx = 0.0; + Real sy = 0.0; + Real sqx =0.0; + Real sxy = 0.0; + + for (int i=0; i < input.sz();i++) { + Real x=input[i].x; + Real y = input[i].y; + sx += x; + sy += y; + sqx += sqr(x); + sxy += x*y; + } + int N = input.sz(); + + + coef = (N * sxy - sx*sy )/(N*sqx - sqr(sx)); + offset = (sy - coef * sx)/N; + +} diff --git a/staff.cc b/staff.cc deleted file mode 100644 index 8b5c0782c5..0000000000 --- a/staff.cc +++ /dev/null @@ -1,175 +0,0 @@ -#include "staff.hh" -#include "stcol.hh" -#include "sccol.hh" -#include "debug.hh" - -Staff::Staff(Staff const&src) -{ - PL_copy(voices,src.voices); - PL_copy(commands,src.commands); - assert(!cols.size()); // cols is a runtime field. - - score_ = src.score_; - pscore_ = src.pscore_; -} - -Paperdef* -Staff::paper() const{ - return score_->paper_; -} - -void -Staff::clean_cols() -{ - PCursor stc(cols); - for(; stc.ok(); ){ - if (!stc->score_column->used()) - stc.del(); - else - stc++; - } -} - -Staff_column * -Staff::get_col(Real w, bool mus) -{ - Score_column* sc = score_->find_col(w,mus); - assert(sc->when == w); - PCursor stc(cols); - for (; stc.ok(); stc++) { - if (*stc->score_column > *sc) // too far - break; - if (sc == stc->score_column) - return stc; - } - Staff_column* newst = create_col(sc); - - if (!stc.ok()) { - cols.bottom().add(newst); - return cols.bottom(); - } - - if (mus) { - stc.insert(newst); - return newst; - } - - if ((stc-1)->when() == newst->when()) { - stc--; - } - - stc.insert(newst); - - return newst; -} - - -void -Staff::add_voice(Voice *v) -{ - voices.bottom().add(v); -} - -/* - put all stuff grouped vertically in the Staff_cols - */ -void -Staff::setup_staffcols() -{ - - for (PCursor vc(voices); vc.ok(); vc++) { - - Real now = vc->start; - for (PCursor ve(vc->elts); ve.ok(); ve++) { - - Staff_column *sc=get_col(now,true); - sc->add(ve); - now += ve->duration; - } - } - - for (PCursor cc(commands); cc.ok(); cc++) { - Staff_column *sc=get_col(cc->when,false); - sc->s_commands.add(cc); - } -} - -/// merge commands from score -void -Staff::add_commands(PointerList const &cl) -{ - PCursor score_c(cl); - PCursor cc(commands); - - while (score_c.ok()) { - while (cc.ok() && cc->when <= score_c->when) - cc++; - - Command*nc = new Command (*(* score_c)); - if (cc.ok()) { - // cc->when > score_c->when - cc.insert( nc ); - } else { - commands.bottom().add( nc); - cc = commands.bottom(); - } - score_c++; - } - - // now integrate break commands with other commands. - // maybe do this in derived functions. -} - -void -Staff::process() -{ - setup_staffcols(); - OK(); - for (PCursor sc(cols); sc.ok(); sc++) { - sc->process_commands(); - sc->process_requests(); - } - grant_requests(); -} - -void -Staff::OK() const -{ -#ifndef NDEBUG - cols.OK(); - commands.OK(); - voices.OK(); - assert(score_); -#endif -} - - -Real -Staff::last() const -{ - Real l = 0.0; - for (PCursor vc(voices); vc.ok(); vc++) { - l = MAX(l, vc->last()); - } - return l; -} - - -void -Staff::print() const -{ -#ifndef NPRINT - mtor << "Staff {\n"; - for (PCursor vc(voices); vc.ok(); vc++) { - vc->print(); - - } - mtor <<"}\n"; -#endif -} - -Staff::Staff() -{ - score_ =0; - pscore_=0; -} diff --git a/staff.hh b/staff.hh deleted file mode 100644 index f2c7294de0..0000000000 --- a/staff.hh +++ /dev/null @@ -1,66 +0,0 @@ -#ifndef STAFF_HH -#define STAFF_HH - -#include "score.hh" -#include "voice.hh" -#include "command.hh" - - -/// base class for a collection of voices. -struct Staff { - /// synchronous horizontal stuff - PointerList voices; - - /// commands in chronological order - PointerList commands; - - /// runtime field - PointerList cols; - - /// indirections to the Score and PScore - Score *score_; - PScore *pscore_; - - /****************************************************************/ - Staff(const Staff&src); - void add_voice(Voice *v); - void add_staff_column(Staff_column *sp); - - Paperdef*paper()const; - /// interpret all requests and add items to #destination#. - void process(); - /** - This routines calls virtual functions from Staff, to delegate the - interpretation of requests to a derived class of Staff */ - void setup_staffcols(); - - void OK() const; - void print() const; - Real last() const; - void clean_cols() ; - Staff_column * get_col(Real,bool); - - void add_commands(PointerListconst & sv); - /** - add all commands from sv. - - PRE - sv is time-ordered. - */ - - Staff(); - /** - Should construct with Score as arg, but this isn't known during parsing. - */ - /**************************************************************** - VIRTUALS - ****************************************************************/ - virtual Staff*clone()const=0; - virtual void set_output(PScore * destination)=0; - virtual void grant_requests()=0; - virtual Staff_column * create_col(Score_column * )=0; - virtual ~Staff() { } -}; -#endif - - diff --git a/stcol.cc b/stcol.cc deleted file mode 100644 index 799daed316..0000000000 --- a/stcol.cc +++ /dev/null @@ -1,30 +0,0 @@ -#include "stcol.hh" -#include "sccol.hh" -#include "voice.hh" - -bool -Staff_column::mus() const -{ - return score_column->musical; -} - -Real -Staff_column::when() const -{ - return score_column->when; -} - -void -Staff_column::add(Voice_element*ve) -{ - Real d= ve->duration; - if (d){ - score_column->durations.add(d); - } - - v_elts.add(ve); -} - -Staff_column::Staff_column(Score_column*s) { - score_column = s; -} diff --git a/stcol.hh b/stcol.hh deleted file mode 100644 index 1d8b09c61e..0000000000 --- a/stcol.hh +++ /dev/null @@ -1,35 +0,0 @@ -/* - stcol.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef STCOL_HH -#define STCOL_HH -#include "proto.hh" -#include "vray.hh" - -/// store simultaneous requests -struct Staff_column { - Score_column *score_column; - - /// fields to collect data vertically. - svec v_elts; - svec s_commands; - - Staff_column(Score_column*s); - bool mus() const; - Real when() const; - void add(Voice_element*ve); - /**************************************************************** - VIRTUAL - ****************************************************************/ - //virtual Staff_column *clone() const=0; - virtual void process_requests()=0; - virtual void process_commands()=0; - virtual ~Staff_column() { } -}; - - -#endif // STCOL_HH - diff --git a/stem.cc b/stem.cc deleted file mode 100644 index fd6634c6bf..0000000000 --- a/stem.cc +++ /dev/null @@ -1,99 +0,0 @@ -#include "stem.hh" -#include "dimen.hh" -#include "debug.hh" -#include "pstaff.hh" -#include "pscore.hh" -#include "paper.hh" -#include "lookupsyms.hh" -#include "molecule.hh" - -const int STEMLEN=7; - -Stem::Stem(int c) -{ - minnote = maxnote = 0; - bot = top = 0; - flag = 4; - staff_center=c; -} - -void -Stem::print()const -{ - mtor << "Stem minmax=["<< minnote<<","< stafftop + 2) { - top = maxnote; - bot = staff_center + staff_center/2; - flag = -flag; - }else { - Real mean = (minnote+maxnote)/2; - - top = (mean > staff_center) ? maxnote : maxnote+STEMLEN; - bot = (mean > staff_center) ? minnote-STEMLEN : minnote; - flag = (mean > staff_center) ? -flag : flag; - } -} - -void -Stem::postprocess() -{ - calculate(); - brew_molecole(); -} - -Interval -Stem::width()const -{ - if (ABS(flag) <= 4) - return Interval(0,0); // TODO! - Paperdef*p= pstaff_->pscore_->paper_; - return p->lookup_->flag(flag).dim.x; -} - -void -Stem::brew_molecole() -{ - assert(pstaff_); - assert(bot!=top); - assert(!output); - - Paperdef *p = pstaff_->pscore_->paper_; - Parametric_symbol *stem = p->lookup_->stem(); - - Real dy = p->interline()/2; - String y1 =print_dimen( dy * bot); - String y2 = print_dimen(dy * top); - Symbol ss =stem->eval(y1,y2); - delete stem; - - output = new Molecule(Atom(ss)); - - if (ABS(flag) > 4){ - Symbol fl = p->lookup_->flag(flag); - Molecule m(fl); - if (flag < -4){ - output->add_bot(m); - } else if (flag > 4) { - output->add_top(m); - } else - assert(false); - } - - if (flag > 0){ - Real dx = pstaff_->pscore_->paper_->note_width(); // ugh - output->translate(Offset(dx,0)); - } -} diff --git a/stem.hh b/stem.hh deleted file mode 100644 index acbebe0d92..0000000000 --- a/stem.hh +++ /dev/null @@ -1,44 +0,0 @@ -/* - stem.hh -- part of LilyPond - - (c) 1996 Han-Wen Nienhuys -*/ - -#ifndef STEM_HH -#define STEM_HH -#include "item.hh" - -/// the rule attached to the ball -struct Stem : public Item { - // heads the stem encompasses (positions) - int minnote, maxnote; - - int staff_center; - - // extent of the stem (positions) - int bot, top; - - // flagtype? 4 none, 8 8th flag, 0 = beam. - int flag; - - /****************/ - - void postprocess(); - Stem(int center); - void print() const; - Interval width() const; -private: - void calculate(); - void brew_molecole(); -}; -/** - takes care of: - - \begin{itemize} - \item the rule - \item the flag - \item up/down position. - \end{itemize} - */ - -#endif diff --git a/suzan.ly b/suzan.ly deleted file mode 100644 index 59eb0c7489..0000000000 --- a/suzan.ly +++ /dev/null @@ -1,8 +0,0 @@ -% testje - -score{ - rhythmstaff { - 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.cc b/symbol.cc deleted file mode 100644 index 907f1d7282..0000000000 --- a/symbol.cc +++ /dev/null @@ -1,32 +0,0 @@ -#include "symbol.hh" - -Symbol::Symbol() - : dim(Interval(0,0),Interval(0,0)) -{ - tex = "\\unknown"; -} -Symbol::Symbol(String s, Box b) - : dim(b) -{ - tex = s; -} - -/****************************************************************/ - -Symbol -Parametric_symbol::eval(String args1)const -{ - svec a; - a.add(args1); - return eval(a); -} - -Symbol -Parametric_symbol::eval(String args1,String arg2)const -{ - svec a; - a.add(args1); - a.add(arg2); - return eval(a); -} - diff --git a/symbol.hh b/symbol.hh deleted file mode 100644 index 4f26e04e66..0000000000 --- a/symbol.hh +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef SYMBOL_HH -#define SYMBOL_HH -#include "string.hh" -#include "boxes.hh" -#include "proto.hh" - -struct Symbol { - String tex; - Box dim; - - Symbol (String, Box); - Symbol(); -}; - -struct Parametric_symbol { - Symtables*symtables_; // indirection - - /*****************/ - - Parametric_symbol(Symtables*s) { symtables_ = s; } - Symbol eval(String args1) const; // convenience - Symbol eval(String args1,String arg2) const; // convenience - virtual Symbol eval(svec args)const =0; - virtual ~Parametric_symbol(){} -}; - -#endif diff --git a/symtable.cc b/symtable.cc deleted file mode 100644 index e963b64d12..0000000000 --- a/symtable.cc +++ /dev/null @@ -1,58 +0,0 @@ -#include "misc.hh" -#include "dimen.hh" -#include "debug.hh" -#include "real.hh" -#include "symbol.hh" -#include "assoc.hh" -#include "symtable.hh" - - -Symbol -Symtable::lookup(String s) const -{ - if (elt_query(s)) - return (*this)[s]; - else { - error( "Unknown symbol " +s+'\n'); - } -} - -Symtable* -Symtables::operator()(String s) -{ - return Assoc::operator[](s); -} - -void -Symtables::read(Text_db &symini) -{ - while (!symini.eof()) { - Text_record r( symini++); - if (r[0] == "end" ) - return; - assert (r[0] == "table"); - - String tabnam = r[1]; - Symtable * sp = new Symtable; - while (!symini.eof()){ - r = symini++; - if (r[0] == "end") - break; - - assert(r.sz() == 6); - int i=0; - String id=r[i++]; - String tex=r[i++]; - svec dims; - for (int j=0; j < 4; j++) - dims.add( parse_dimen(r[i++])); - - Symbol s(tex, Box(dims)); - (*sp)[id] = s; - } - (*this)[tabnam] = sp; - } -} - - - diff --git a/symtable.hh b/symtable.hh deleted file mode 100644 index a1443a7d3b..0000000000 --- a/symtable.hh +++ /dev/null @@ -1,23 +0,0 @@ -/* - lilypond, (c) 1996 Han-Wen Nienhuys -*/ -#ifndef SYMTABLE_HH -#define SYMTABLE_HH -#include "assoc.hh" -#include "string.hh" -#include "symbol.hh" - -struct Symtable : public Assoc { - Symbol lookup(String)const; -}; - - -struct Symtables : private Assoc { - void read(Text_db&) ; - Symtable* operator()(String s); - -}; - - -#endif - diff --git a/table.cc b/table.cc deleted file mode 100644 index 58d1c425e1..0000000000 --- a/table.cc +++ /dev/null @@ -1,64 +0,0 @@ -#include "glob.hh" -#include "debug.hh" -#include "string.hh" -#include "identifier.hh" -#include "keyword.hh" -#include "associter.hh" -#include "parser.hh" - -static Keyword_ent the_key_tab[]={ - "voice", VOICE, - "rhythmstaff", RHYTHMSTAFF, - "melodicstaff", MELODICSTAFF, - "score", SCORE, - "bar", BAR, - "output", OUTPUT, - "cm", CM, - "pt", PT, - "in", IN, - "mm", MM, - "paper", PAPER, - "width", WIDTH, - "meter", METER, - "unitspace", UNITSPACE, - "skip", SKIP, - "commands", COMMANDS, - "staff", STAFF, - "geometric", GEOMETRIC, - 0,0 -} ; - - -int -lookup_keyword(String s) -{ - static Keyword_table table(the_key_tab); - return table.lookup(s); -} - -Assoc the_id_tab; - -Identifier* -lookup_identifier(String s) -{ - if (!the_id_tab.elt_query(s)) - return 0; - - return the_id_tab[s]; -} - -void -add_identifier(Identifier*i) -{ - the_id_tab[i->name] = i; -} - -void -delete_identifiers() -{ - - for (Assoc_iter ai(the_id_tab); ai.ok(); ai++) { - mtor << "deleting: " << ai.key()<<'\n'; - delete ai.val(); - } -} diff --git a/template1.cc b/template1.cc deleted file mode 100644 index ece4e2ff18..0000000000 --- a/template1.cc +++ /dev/null @@ -1,23 +0,0 @@ -#include "line.hh" - -#include "plist.hh" -#include "pcol.hh" -#include "item.hh" -#include "request.hh" -#include "command.hh" -#include "spanner.hh" - -#include "list.cc" -#include "plist.cc" -#include "cursor.cc" - -#define PLC_instantiate(a) PL_instantiate(a); PL_instantiate(const a) - -PLC_instantiate(Line_of_score); -PLC_instantiate(Line_of_staff); -PLC_instantiate(Item); -PLC_instantiate(Spanner); -PLC_instantiate(PStaff); -PLC_instantiate(Idealspacing); -PLC_instantiate(PCol); - diff --git a/template2.cc b/template2.cc deleted file mode 100644 index 5e0431c42a..0000000000 --- a/template2.cc +++ /dev/null @@ -1,19 +0,0 @@ -#include "line.hh" -#include "symbol.hh" -#include "voice.hh" - -#include "staff.hh" -#include "sccol.hh" -#include "stcol.hh" -#include "spanner.hh" - -#include "list.cc" -#include "plist.cc" -#include "cursor.cc" -PL_instantiate(Score_column); -PL_instantiate(Staff_column); -PL_instantiate(Staff); -PL_instantiate(Voice_element); -PL_instantiate(Voice); - - diff --git a/template3.cc b/template3.cc deleted file mode 100644 index 92921bb29a..0000000000 --- a/template3.cc +++ /dev/null @@ -1,12 +0,0 @@ -#include "request.hh" -#include "command.hh" -#include "molecule.hh" -#include "list.cc" -#include "plist.cc" -#include "cursor.cc" -PL_instantiate(Atom); -PL_instantiate(Command); -PL_instantiate(Request); - - - diff --git a/tex.cc b/tex.cc deleted file mode 100644 index ae9dc1b5f3..0000000000 --- a/tex.cc +++ /dev/null @@ -1,32 +0,0 @@ -#include "dimen.hh" -#include "tex.hh" -#include "symbol.hh" -#include "const.hh" - -String -vstrut(Real h) -{ - return String("\\vrule height ") + print_dimen(h) + "depth 0pt width 0pt"; -} - - -static void -substitute_arg(String& r, String arg) -{ - int p = r.pos('%'); - if (!p ) return ; - else p--; - r = r.left(p) + arg + r.right(r.len() - p -1); -} - - -String -substitute_args(String source, svec args) -{ - String retval (source); - for (int i = 0 ; i < args.sz(); i++) - substitute_arg(retval, args[i]); - while (retval.pos('%')) - substitute_arg(retval, ""); - return retval; -} diff --git a/tex.hh b/tex.hh deleted file mode 100644 index 546797a7c1..0000000000 --- a/tex.hh +++ /dev/null @@ -1,21 +0,0 @@ -#ifndef TEX_HH -#define TEX_HH - -#include "string.hh" -#include "boxes.hh" - -/// parameter substitution in TeXstrings -String -substitute_args(String source, svec args); -/** - this structure provides a simple macro mechanism: - - if source == "tex%bla%", then - eval({"X","Y"}) == "texXblaY" - */ - -/// #h# is in points -String vstrut(Real h); - - -#endif diff --git a/tstream.cc b/tstream.cc deleted file mode 100644 index 05e2e9c93e..0000000000 --- a/tstream.cc +++ /dev/null @@ -1,75 +0,0 @@ -#include -#include -#include "tex.hh" -#include "main.hh" -#include "tstream.hh" -#include "debug.hh" - -Tex_stream::Tex_stream(String filename) -{ - os = new ofstream(filename); - if (!*os) - error("can't open `" + filename+"\'"); - nest_level = 0; - outputting_comment=false; - header(); -} -void -Tex_stream::header() -{ - *os << "% Creator: " << get_version(); - *os << "% Automatically generated, at "; - time_t t(time(0)); - *os << ctime(&t); -//*os << "% from input file ..\n"; -} -Tex_stream::~Tex_stream() -{ - delete os; - assert(nest_level == 0); -} - -// print string. don't forget indent. -Tex_stream & -Tex_stream::operator<<(String s) -{ - - for (const char *cp = s; *cp; cp++) { - if (outputting_comment) { - *os << *cp; - if (*cp == '\n') { - outputting_comment=false; - - } - continue; - } - switch(*cp) - { - case '%': - outputting_comment = true; - *os << *cp; - break; - case '{': - nest_level++; - *os << *cp; - break; - case '}': - nest_level--; - *os << *cp; - assert (nest_level >= 0); - /* FALTHROUGH */ - - case '\n': - *os << "%\n"; - *os << String(' ', nest_level); - break; - default: - *os << *cp; - break; - } - } - return *this; -} - - -/****************************************************************/ diff --git a/tstream.hh b/tstream.hh deleted file mode 100644 index 9474dd69a8..0000000000 --- a/tstream.hh +++ /dev/null @@ -1,27 +0,0 @@ -#ifndef TSTREAM__HH -#define TSTREAM__HH - -#include -#include "string.hh" - -/// TeX output -struct Tex_stream { - bool outputting_comment; - ostream *os; - int nest_level; - - /// open a file for writing - Tex_stream(String filename); - void header(); - /// delegate conversion to string class. - Tex_stream &operator<<(String); - - /// close the file - ~Tex_stream(); -}; -/** - Use this class for writing to a TeX file. - It counts braces to prevent nesting errors, and - it will add a comment sign before each newline. - */ -#endif diff --git a/version.cc b/version.cc deleted file mode 100644 index 401273b6b1..0000000000 --- a/version.cc +++ /dev/null @@ -1,9 +0,0 @@ -#include "version.hh" - -static char *s = "LilyPond version " VERSIONSTR " compiled on " __DATE__ " at " __TIME__ "\n"; - -const char * -get_version() -{ - return s; -} diff --git a/voice.cc b/voice.cc deleted file mode 100644 index 379cbae23a..0000000000 --- a/voice.cc +++ /dev/null @@ -1,77 +0,0 @@ -#include "debug.hh" -#include "voice.hh" - -Voice::Voice(Voice const&src) -{ - PL_copy(elts, src.elts); - start = src.start; -} - -Voice::Voice() -{ - start = 0.0; -} - -void -Voice::add(Voice_element*v) -{ - elts.bottom().add(v); -} - -void -Voice::print() const -{ - #ifndef NPRINT - - mtor << "start: "<< start< vec(elts); vec.ok(); vec++) - vec->print(); -#endif -} - -Real -Voice::last() const -{ - Real l =start; - for (PCursor vec(elts); vec.ok(); vec++) - l += vec->duration; - return l; -} -/****************************************************************/ -void -Voice_element::print() const -{ -#ifndef NPRINT - mtor << "voice_element { dur :"<< duration <<"\n"; - for (PCursor rc(reqs); rc.ok(); rc++) { - rc->print(); - } - mtor << "}\n"; -#endif -} -void -Voice_element::add(Request*r) -{ - if (r->rhythmic()) { - assert (!duration); - duration = r->duration(); - } - reqs.bottom().add(r); -} - - -Voice_element::Voice_element() -{ - voice = 0; - group = 0; - duration = 0.0; -} - -Voice_element::Voice_element(Voice_element const&src) -{ - duration=src.duration; - voice=src.voice; - PointerList__copy(Request*, reqs, src.reqs, clone()); - group=src.group; - assert(!granted_items.size() && !granted_spanners.size()); -} diff --git a/voice.hh b/voice.hh deleted file mode 100644 index 7180ece99e..0000000000 --- a/voice.hh +++ /dev/null @@ -1,53 +0,0 @@ -#ifndef VOICE_HH -#define VOICE_HH - - -#include "plist.hh" -#include "request.hh" - -/// class for horizontal stuff. -struct Voice { - PointerList elts; - Real start; - - /****************/ - Real when(const Voice_element*)const; - Real last() const; - Voice(); - Voice(Voice const&); - void add(Voice_element*); - void print() const; -}; -/** - - Voice is a ordered row of Voice_elements. It is strictly horizontal: - you cannot have two rhythmic elements running parallel in a Voice - - */ - -struct Voicegroup { - /// don't know how to identify these. -}; - -/// one horizontal bit. -struct Voice_element { - Real duration; - const Voicegroup *group; - const Voice *voice; - PointerList reqs; - - List granted_items; - List granted_spanners; - - /****************/ - - void add(Request*); - Voice_element(); - Voice_element(Voice_element const & src ); - void print ()const; -}; -/** Apart from being a container for the requests, Voice_element is - glue between related items and spanners, between requests and - (voice)groups - */ -#endif diff --git a/warn.cc b/warn.cc deleted file mode 100644 index 426173ee0c..0000000000 --- a/warn.cc +++ /dev/null @@ -1,18 +0,0 @@ -#include "debug.hh" - ostream &warnout (cerr); - ostream *mlog(&cerr); - - - -void warning(String s) -{ - WARN << s; -} - - -void error(String s) -{ - cerr << "\n" << s << "\nexiting..\n"; - exit(1); -} -