]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.10
authorfred <fred>
Mon, 18 Nov 1996 23:18:57 +0000 (23:18 +0000)
committerfred <fred>
Mon, 18 Nov 1996 23:18:57 +0000 (23:18 +0000)
kortjakje.ly
src/scommands.cc

index 4c555c88eb744c34ba69e34b45e0d62884dacc96..c4c20cf1b7307cbb27a0d4af4010b30679690734 100644 (file)
@@ -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
+}
+
index 7b8c8ed9c53bbc185f7afc9975677cdacc6fbf67..00830e4115cd920f9abb00c0c1014163cb8a307c 100644 (file)
@@ -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<Command*> 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<Command*>
 Score_commands::last_insertion(Real w)
 {    
-    PCursor<Command*> pc(*this);    
-    while (pc.ok() && pc->when <= w)
-       pc++;
+    PCursor<Command*> 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<Command> com)
+Score_commands::add_seq(svec<Command> com, bool checkbreak)
 {
     if (!com.sz())
        return;
+    
     Real when = com[0].when;
 
-    PCursor<Command*> 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<Command*> begin(first(when));
+    PCursor<Command*> 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<Command> 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<Command*> firstc,
 {
     assert(last->when==firstc->when);
     PCursor<Command*> 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<Command*> 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<Command> 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();