From 2907f9104fa696ba2786e30156516f94ee158785 Mon Sep 17 00:00:00 2001 From: fred Date: Mon, 18 Nov 1996 23:18:57 +0000 Subject: [PATCH] lilypond-0.0.10 --- kortjakje.ly | 20 +++++-- src/scommands.cc | 145 ++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 137 insertions(+), 28 deletions(-) diff --git a/kortjakje.ly b/kortjakje.ly index 4c555c88eb..c4c20cf1b7 100644 --- a/kortjakje.ly +++ b/kortjakje.ly @@ -5,17 +5,20 @@ melodie = voice { $ \octave c %%% theme - c c g g a a g2 f f e e d d c2 - %%% var 1 + c c g g a a g2 f f e e d d c2 + g g f f e e d d g g f f e e d d + %%% var 1 c r8 c8 ( ) g r8 g8 ( ) a r8 a8 ( ) g r4 f r8 f8 ( ) e4 r8 e8 ( ) d4 r8 d8 ( ) c4 r4 $ } begeleiding = voice { - $ \octave ``c + $ \octave `c %%% theme - `c c e c f c e c d `b c `a `f `g `c2 + `c c e c f c e c d `b c `a `f `g `c2 + \octave `c + e `g d `g c `g `b `g e `g d `g c `g `b `g %%%% var 1 r8 e8() c r8 e8() c r8 f8()c r8 e8()c r8 d8()`b r8 c8()`a r8 `a8()`f r8 `e8()`c @@ -35,6 +38,11 @@ score { } commands { meter 2 4 - skip 16:0 + clef bass + skip 2:0 + clef violin +% skip 2:0 + skip 32:0 } -} \ No newline at end of file +} + diff --git a/src/scommands.cc b/src/scommands.cc index 7b8c8ed9c5..00830e4115 100644 --- a/src/scommands.cc +++ b/src/scommands.cc @@ -2,6 +2,10 @@ #include "debug.hh" #include "parseconstruct.hh" +/* + ARG! + */ + /* maybe it's time for a "narrowing" cursor? */ @@ -11,34 +15,61 @@ Score_commands::first(Real w) PCursor pc(*this); while (pc.ok() && pc->when < w) pc++; - - return pc; + if (!pc.ok() || pc->when != w) { + Command *c = new Command(w); + c->priority = 10000; + if (!pc.ok()) + pc.add(c); + else + pc.insert(c); + } + + return pc; } +/* + RETURN: pc->when == w && pc.ok + */ PCursor Score_commands::last_insertion(Real w) { - PCursor pc(*this); - while (pc.ok() && pc->when <= w) - pc++; + PCursor pc(first(w)), next(pc); + while (next.ok() && next->when == w) { + pc=next; + next++; + } + if (pc->priority != -10000) { + Command*c = new Command(w); + c->priority = -10000; + pc.add(c); + pc ++; + } + return pc; } +/* + */ void -Score_commands::add_seq(svec com) +Score_commands::add_seq(svec com, bool checkbreak) { 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); + PCursor begin(first(when)); + PCursor end(last_insertion(when)); + if (checkbreak && is_breakable(when)) { + if (com[0].priority < 0) + while (begin->code != BREAK_END) + begin++; else - pc.insert(c); + while (end->code != BREAK_PRE) + end--; + } + for (int i = 0; i < com.sz(); i++) { + insert_between(com[i], begin, end); } } @@ -58,16 +89,20 @@ Score_commands::set_breakable(Real when) svec seq; Command k(when); + k.priority = 5; k.code = BREAK_PRE; seq.add(k); + k.priority = 4; k.code = BREAK_MIDDLE; seq.add(k); + k.priority = 3; k.code = BREAK_POST; seq.add(k); + k.priority = 2; k.code = BREAK_END; seq.add(k); - add_seq(seq); + add_seq(seq,false); } bool @@ -87,8 +122,9 @@ Score_commands::insert_between(Command victim, PCursor firstc, { assert(last->when==firstc->when); PCursor c(firstc+1); - while (c != last) { // hmm what if !last.ok()? - if (victim.priority > c->priority) { + assert(last.ok()); + while (c < last) { + if (c->priority <= victim.priority) { c.insert(new Command(victim)); return; } @@ -101,6 +137,7 @@ void Score_commands::add_command_to_break(Command pre, Command mid, Command post) { Real w = pre.when; + assert(w >= 0); PCursor c ( first(w)), f(c), l(c); while (!c->isbreak()) @@ -119,9 +156,10 @@ Score_commands::add_command_to_break(Command pre, Command mid, Command post) f = l; while (!c->isbreak()) c++; - l = c++; - insert_between(post, f, l); + l = c++; assert(l.ok() && l->when ==w && l->code == BREAK_END); + + insert_between(post, f, l); } void @@ -135,23 +173,82 @@ Score_commands::process_add(Command c) { bool encapsulate =false; Real w = c.when; + assert(w >= 0); + Command pre(w); Command mid(w); Command post(w); + if (c.code == INTERPRET) + { // UGH + if (c.args[0] == "BAR") { + Command typeset(w); // kut met peren + typeset.code = TYPESET; + typeset.args = c.args; + typeset.priority = 100; + process_add(typeset); + } else if (c.args[0] == "KEY") { + Command typeset(w); + typeset.code = TYPESET; + typeset.args.add("KEY"); + typeset.priority = 70; + process_add(typeset); + } else if (c.args[0] == "CLEF") { + Command typeset(w); + typeset.code = TYPESET; + typeset.args=c.args; + typeset.priority = 90; + process_add(typeset); + } + } + // kut en peer if (c.code == TYPESET) { if (c.args[0] == "BAR") { set_breakable(w); encapsulate = true; mid = c; pre = c; - } + { /* every line a currentkey. */ + Command kc(w); + kc.code =TYPESET; + kc.args.add( "CURRENTKEY"); + kc.priority = 60; + process_add(kc); + } + { /* every line a currentclef. */ + Command kc(w); + kc.code =TYPESET; + kc.args.add( "CURRENTCLEF"); + kc.priority = 80; + process_add(kc); + } + }else if (c.args[0] == "METER" && is_breakable(w)) { encapsulate = true; mid = c; pre = c; post =c; + }else + if( c.args[0] == "KEY" && is_breakable(c.when)) { + encapsulate = true; + mid = c; + pre = c; + post = c; + }else + if (c.args[0] == "CURRENTKEY" && is_breakable(w)) { + post = c; + encapsulate = true; + }else + if (c.args[0] == "CURRENTCLEF" && is_breakable(w)) { + post = c; + encapsulate = true; + }else + if (c.args[0] == "CLEF" && is_breakable(w)) { + encapsulate = true; + post = c; + pre = c; + mid = c; } } @@ -160,7 +257,7 @@ Score_commands::process_add(Command c) else { svec seq; seq.add(c); - add_seq(seq); + add_seq(seq,true); } } @@ -232,9 +329,9 @@ Score_commands::parse(Real l) const Real wholes=0.0; Real stoppos=0.0; - { + { /* all pieces should start with a breakable. */ Command c(0.0); - c.code = TYPESET; + c.code = INTERPRET; c.args.add("BAR"); c.args.add("empty"); nc->process_add(c); @@ -247,6 +344,10 @@ Score_commands::parse(Real l) const measlen = beats_per_meas/Real(one_beat); nc->process_add(*get_meter_command(wholes, beats_per_meas, one_beat)); } + if (cc->args[0] == "KEY"||cc->args[0] == "CLEF") { + cc->when = wholes; + nc->process_add(**cc); + } if (cc->args[0] == "SKIP") { stoppos = wholes + cc->args[1].value() * measlen + cc->args[2].fvalue(); -- 2.39.5