]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.0.40
authorfred <fred>
Sun, 24 Mar 2002 19:34:34 +0000 (19:34 +0000)
committerfred <fred>
Sun, 24 Mar 2002 19:34:34 +0000 (19:34 +0000)
61 files changed:
ANNOUNCE
Documentation/index.pod
TODO
bin/genheader
bin/make_patch
bin/make_website
flower/lib/dstream.cc
flower/lib/include/fproto.hh
init/dynamic.ini [new file with mode: 0644]
init/symbol.ini
init/table_sixteen.ini
input/cadenza.ly
lib/include/proto.hh
lily/bar.cc
lily/beam.cc
lily/clef-item.cc
lily/dynamic-reg.cc [new file with mode: 0644]
lily/identifier.cc
lily/include/dynamic-reg.hh [new file with mode: 0644]
lily/include/identifier.hh
lily/include/identparent.hh
lily/include/lookup.hh
lily/include/musicalrequest.hh
lily/include/paper-def.hh
lily/include/score-walker.hh
lily/include/staff-column.hh
lily/include/staff-elem-info.hh
lily/include/symtable.hh
lily/include/text-def.hh
lily/include/text-item.hh
lily/key-item.cc
lily/lexer.l
lily/local-key-item.cc
lily/lookup.cc
lily/lyric-item.cc
lily/meter.cc
lily/mylexer.cc
lily/notehead.cc
lily/paper-def.cc
lily/parser.y
lily/pscore.cc
lily/request.cc
lily/rest.cc
lily/score-walker.cc
lily/script.cc
lily/slur.cc
lily/staff-column.cc
lily/staff.cc
lily/staffsym.cc
lily/stem.cc
lily/symtable.cc
lily/tex-beam.cc
lily/tex-slur.cc
lily/text-def.cc
lily/text-item.cc
lily/voice-group-regs.cc
lily/walk-regs.cc
make/ACVariables.make.in [new file with mode: 0644]
make/Makefile
make/lilypond.spec [new file with mode: 0644]
tex/lilyponddefs.tex

index 48bbdd0cbd898c4cb5980785d642f1d1d773a856..df31a15ba0eb004dd2a269af60180847d21d084a 100644 (file)
--- a/ANNOUNCE
+++ b/ANNOUNCE
@@ -1,3 +1,5 @@
+[Draft version]
+[Draft version]
 
 CALL FOR HACKERS: LilyPond, the Music Typesetter
 
index f473d9c456146d7aba85e41272557fe14ab2b765..4e12783de1d0fd5861749721e0525af8df86ca2a 100644 (file)
@@ -86,4 +86,15 @@ MIDI output
 >
 The DOC++ documentation of the C++ sources.
 </a
->
\ No newline at end of file
+>
+
+=item *
+<a href=ftp://pcnov095.win.tue.nl/pub/lilypond
+>
+Get it!
+</a
+>
+
+=head1 AUTHOR
+
+Han-Wen Nienhuys <hanwen@stack.nl>, for this page
diff --git a/TODO b/TODO
index 87d3ef806cf8f4ebb9a3d4b23849d3a98421d3c6..b3d03f91ba5704e96dfc1766f2dd24140eb2437a 100644 (file)
--- a/TODO
+++ b/TODO
@@ -1,6 +1,6 @@
 before 0.1
 
-       * remove spurious/outdated comments in .ly
+       * remove spurious/outdated comments in .ly, debug .ly
        
        * pushgroup, popgroup.
 
@@ -14,6 +14,8 @@ before 0.1
 
        * caching of Register_group_register hierarchies.
 
+       * midi esp.: use I32 iso int where 32 bits are needed (or assumed...)
+
 This is an assorted collection of stuff that will be done, might be
 done, or is an idea that I want to think about
 
@@ -24,8 +26,12 @@ STUFF
 
        * do platform stuff: configure, header(s), targets, build (out?)
 
+       * make install.
+       
 BUGS
 
+       * barf if no score_wde_music
+
        * plet bugs: scales.ly
 
        * key at clef change.
@@ -96,12 +102,12 @@ SMALLISH PROJECTS
        * use (char *) iso. String for communication between lexer and
        parser.
 
-       * configure idealspacing: arithmetic spacing
-
-       * fix linking: `Warning: size of symbol'
+       * configure idealspacing: arithmetic
 
        * collision Request_register.
 
+       * make install (gnu dir names)
+
        * LilyPond .rpm and .deb
 
 DOC
@@ -144,6 +150,8 @@ FUTURE
 
 IDEAS
 
+       * integrate Register/Midi stuff
+
        * create libmudela,  or liblily_frontend
 
        * Horizontal_align_item, Vertical_align_item.
index 7c36afe0ae8355ed8644889b7866a9e40e3e7c1c..fba3c1559e881553c2bc1e035b76e13ce0bb50b5 100755 (executable)
@@ -8,10 +8,15 @@ my @pw=(getpwuid($<));
 my $username=$pw[6];
 my $what="implement ";
 $what = "declare " if ($hh_q);
+my ($PROJECT, $cwd);
+$PROJECT = "the LilyPond music typesetter";
+chop($cwd = `pwd`);
+
+$PROJECT= "the Flower Library" if ($cwd =~ /flower/);
 my $headstr ="/*
   $fn -- $what
 
-  source file of the LilyPond music typesetter
+  source file of $PROJECT
 
   (c) 1997 $username <$MAILADRESS>
 */\n";
index 290e2e33da2163e9d97c744d80a8f9ad0b98c880..f74f1ea0cdbee74d2d9c75bb2cd128ccc5f0c2dd 100755 (executable)
@@ -21,7 +21,7 @@ then
        echo cant find $newarc
        exit
   fi
-  tar zfxv $newarc
+  tar zfx $newarc
 fi
 if [ ! -x  $nm$old ]
 then
@@ -29,10 +29,10 @@ then
 
   if [ ! -f $oldarc ]
   then
-       echo cant find oldarc
+       echo cant find $oldarc
        exit
   fi
-   tar zfxv $oldarc
+   tar zfx $oldarc
 fi
 
 #(cd $nm$old; touch depend; make clean)
index 844e60bbd1dc384098d224bc7510edb5e8536745..5b360b94fbdb5bb5113ec6af568cefde61b1b9cb 100755 (executable)
@@ -8,20 +8,25 @@ sub
     }
 }
 
+sub all_refs
+{
+    print "resetting refs.\n";
+
+    foreach $a (<*.html>)
+    {
+       rename $a, "$a~";
+       open HTMLIN, "$a~";
+       open HTMLOUT, ">$a";
+       set_hrefs;
+    }
+}
+
 local $base="lilypond/";
 local @examples=("wohltemperirt");
 
 system  'pod2html';
 
-print "resetting refs.\n";
-
-foreach $a (<*.html>)
-{
-    rename $a, "$a~";
-    open HTMLIN, "$a~";
-    open HTMLOUT, ">$a";
-    set_hrefs;
-}
+print "generating examples";
 
 foreach $a (@examples) {
     $texfile="test";
index e6fdbc0e4dbf2d9a9a827a569559bd038893040a..1197dd79e71c20e13dd4d24bec14e7f52efc14be 100644 (file)
@@ -1,3 +1,5 @@
+
+
 #include <fstream.h>
 #include "assoc.hh"
 #include "dstream.hh"
@@ -53,7 +55,8 @@ Dstream::identify_as(String name)
     local_silence = (*silent)[idx];
     if (classname != idx && !local_silence) {
        classname=idx;
-//     *os << "[" << classname << ":]"; // messy.
+       if (!(*silent)["Dstream"])
+           *os << "[" << classname << ":]"; // messy.
     }
     return *this;
 }
index 8c6fda680ef111acb3db33771fb9e546fcb70f76..bf8a22211c1c327bdec4d8ce0446b5361fe3a493 100644 (file)
@@ -7,6 +7,13 @@
 #ifndef FPROTO_HH
 #define FPROTO_HH
 
+// what the F*** is "int" ?
+// depreciate int, long, etc., use i32, i64, remember: linux-16/linux-64 ?
+/// (i32)
+typedef int i32;
+/// (i64)
+typedef long long I64;
+
 #include "flower-config.hh"
 
 template<class T> struct Array;
@@ -19,7 +26,9 @@ template<class T> struct Cursor;
 template<class T> struct PCursor;
 template<class T> struct Link;
 template<class T> struct Handle;
-template<class T>struct Interval_t;
+template<class T> struct Interval_t;
+template<class T,class Q> struct PQueue;
+
 #include "real.hh"
 
 typedef Interval_t<Real> Interval;
diff --git a/init/dynamic.ini b/init/dynamic.ini
new file mode 100644 (file)
index 0000000..000439d
--- /dev/null
@@ -0,0 +1,10 @@
+
+ppp = dynamic {7 }
+pp = dynamic { 6 }
+p = dynamic { 5 }
+mp = dynamic { 4 }
+mf = dynamic { 3 }
+f = dynamic { 2 }
+ff = dynamic { 1 }
+fff = dynamic { 0 }
+
index 7de1e0f52114984bfd420a9994d570350e3c87dd..cc0f13d39984ddd6b8abeec044fe20369743cc57 100644 (file)
@@ -1,5 +1,5 @@
 
-
+include "dynamic.ini"
 include "dutch.ini" # do not include init/ path
 include "script.ini"
 include "table_sixteen.ini"
index 1b7b379f67270b5c8585c6e78649928aae9aa7cf..240eae0b8b5de3de0f5ed95d62d7717b004ad3de 100644 (file)
@@ -1,11 +1,11 @@
 %
-% spacing info for LilyPond. Do not edit this.
+% spacing info for LilyPond. Do not edit this if you're not a guru.
 % It has a lot of hard-wired stringconstants
 %
 
 table_sixteen=
 symboltables {
-       
+
    texid       "\musixsixteendefs"
 
    % index TeXstring,  xmin xmax ymin ymax
@@ -13,13 +13,13 @@ symboltables {
     "scripts" = table {
            "fermata" "\fermata"                0pt  0pt        0pt 6pt
            "-fermata" "\ifermata"              0pt  0pt        -6pt 0pt
-           "portato" "\portato"                0pt 0pt         0pt 0pt
-           "-portato" "\iportato"              0pt 0pt         0pt 0pt
-           "tenuto" "\tenuto"                  0pt 0pt         0pt 0pt
-           "-tenuto" "\itenuto"                0pt 0pt         0pt 0pt
+           "portato" "\portato"
+           "-portato" "\iportato"
+           "tenuto" "\tenuto"  
+           "-tenuto" "\itenuto"
            "sforzato" "\sforzato"              -0.8pt 4.8pt    -1.92pt 1.92pt
            "marcato" "\marcato"                0pt  4.8pt      0pt 4pt
-           "-marcato" "\imarcato"              0pt  4.8pt      -4pt 0pt 
+           "-marcato" "\imarcato"              0pt  4.8pt      -4pt 0pt
            "staccato" "\staccato"              0pt  0pt         0pt 5pt
            "staccatissimo" "\staccatissimo"    0pt 0pt         0pt 7.5pt
            "-staccatissimo" "\istaccatissimo"  0pt 0pt         -7.5pt 0pt
@@ -30,11 +30,24 @@ symboltables {
      "style" = table {
                "roman" "\settext{%}" 0pt 0pt 0pt 8pt
                "italic"        "\setitalic{%}" 0pt 0pt 0pt 8pt
+               "dynamic"       "\setdynamic{%}" 0pt 0pt 0pt 8pt
      }
+     "dynamics" = table {
+
+       "mf" "\dynmf"
+       "fff" "\dynfff"
+       "ff" "\dynff"
+       "f" "\dynf"
+       "mp" "\dynmp"
+       "p" "\dynp"
+       "pp" "\dynpp"
+       "ppp" "\dynppp"
+
+       }
      "align" = table {
-               "-1"    "\leftalign{%}" 0pt 0pt 0pt 0pt
-               "0"     "\centeralign{%}" 0pt 0pt 0pt 0pt
-               "1"     "\rightalign{%}" 0pt 0pt 0pt 0pt
+               "-1"    "\leftalign{%}"
+               "0"     "\centeralign{%}"
+               "1"     "\rightalign{%}"
        }
 
      "clefs" = table {
@@ -55,8 +68,8 @@ symboltables {
      }
 
      "slur" = table {
-            "whole"    "\slurchar%{%}" 0pt     0pt     0pt     0pt
-            "half"     "\hslurchar%{%}"        0pt     0pt     0pt     0pt
+            "whole"    "\slurchar%{%}"
+            "half"     "\hslurchar%{%}"
      }
      "accidentals" = table {
             "-2"       "\flatflat"     0pt     10.2pt  -2.5pt 7.5pt
@@ -72,7 +85,7 @@ symboltables {
      }
 
      "bars" = table {
-       "empty" "\emptybar"             0pt     0pt     0pt     0pt
+       "empty" "\emptybar"
        "|"     "\maatstreep"           0pt     0.4pt   -8pt    8pt
        "||"    "\finishbar"            0pt     2pt     -8pt    8pt
        ":|"    "\repeatbar"            -4pt    0pt     -8pt    8pt
@@ -99,7 +112,7 @@ symboltables {
      "param" = table {
             "meter"    "\generalmeter{%}{%}"   0pt     10pt    -5pt    5pt
             "linestaf" "\linestafsym{%}{%}"
-            "stem"     "\stem{%}{%}"           
+            "stem"     "\stem{%}{%}"
             "fill"     "\hbox{}"
             "crescendo" "\crescendosym{%}"     0pt     0pt     -3pt    3pt
             "decrescendo" "\decrescendosym{%}" 0pt     0pt     -3pt    3pt
@@ -112,7 +125,7 @@ symboltables {
      }
 
      "flags" = table {
-            "8"        "\eigthflag"            0pt     4pt     0pt     0pt     
+            "8"        "\eigthflag"            0pt     4pt     0pt     0pt
             "16"       "\sixteenthflag"                0pt     4pt     0pt     0pt
             "32"       "\thirtysecondflag"     0pt     4pt     0pt     0pt
             "-8"       "\deigthflag"           0pt     4pt     0pt     0pt
@@ -121,8 +134,8 @@ symboltables {
      }
 
      "beamslopes" = table {
-            "slope"    "\beamslope{%}{%}" 
-            "horizontal"       "\rulesym{%}{%}"        
+            "slope"    "\beamslope{%}{%}"
+            "horizontal"       "\rulesym{%}{%}"
      }
 
 }
index 76095fc06e4e3fe6128313726c4a2fbb293ccfb6..ecfda88354394f7891170add78543ef747ce1207 100644 (file)
@@ -8,7 +8,7 @@ cad = music { $
        \duration { 8}
        \textstyle "italic"
        \clef \violin 
-       'c4._"f" g8
+       'c4.\mf g8
        \textstyle  "roman" 
 
        ['e^"accel" ()'d 'c b]
@@ -55,4 +55,4 @@ score {
        }
        paper {}
        midi { tempo 4:80 }
-}
\ No newline at end of file
+}
index e9d3e60d38b7ce3880a02ff374d0b1a373dcf05f..4b3a8f91c5831d2d87558780ace5b44316e2c134 100644 (file)
 #include "fproto.hh"
 #include "real.hh"
 
-/// (i64)
-typedef long long Int64;
-
-struct Absdynamic_req;
+struct Absolute_dynamic_req;
 struct Accidental;
 struct Atom;
 struct Bar;
@@ -22,6 +19,7 @@ struct Barcheck_req;
 struct Bar_req;
 struct Beam;
 struct Beam_req;
+struct Blank_req;
 struct Box;
 struct Bracket_req;
 struct Cadenza_req;
@@ -41,6 +39,7 @@ struct Duration;
 struct Duration_iterator;
 struct Durational_req;
 struct Dynamic;
+struct Dynamic_req;
 struct Group_change_req;
 struct Group_feature_req;
 struct Idealspacing;
@@ -88,11 +87,11 @@ struct Midi_track;
 struct Midi_voice;
 struct Midi_walker;
 struct Mixed_qp;
-class My_midi_lexer;
-class My_midi_parser;
-class Midi_event;
-class Midi_score;
-class Midi_track;
+struct My_midi_lexer;
+struct My_midi_parser;
+struct Midi_event;
+struct Midi_score;
+struct Midi_track;
 struct Molecule;
 struct Musical_req;
 struct Music_general_chord;
@@ -137,7 +136,7 @@ struct Source_file;
 struct Spacing_req ;
 struct Span_req;
 struct Spanner;
-struct Blank_req;
+struct Subtle_req;
 struct Staff;
 struct Staff_column;
 struct Staff_elem;
index 32a7cd5fe6aaf32605c1ea2224625e5058a84541..8b831d206abb23b98558f03060a860e95fa06c29 100644 (file)
@@ -21,7 +21,7 @@ Bar::do_print()const
 Molecule*
 Bar::brew_molecule_p()const
 {    
-    Symbol s = paper()->lookup_p_->bar(type);
+    Symbol s = paper()->lookup_l()->bar(type);
     Molecule*output = new Molecule(Atom(s));
     return output;
 }
index 64f3e3cf775aa721316b216328443bcc8b468584..b9fbd0a28c80525f3f20e72172798df5f5d0f8ae 100644 (file)
@@ -111,7 +111,7 @@ Beam::solve_slope()
 
                                // URG
     Real sl = slope*paper()->internote();
-    paper()->lookup_p_->beam(sl, 20 PT);
+    paper()->lookup_l()->beam(sl, 20 PT);
     slope = sl /paper()->internote();
 }
 
@@ -207,7 +207,7 @@ Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
     Real dy=paper()->internote()*2;
     Real stemdx = paper()->rule_thickness();
     Real sl = slope*paper()->internote();
-    paper()->lookup_p_->beam(sl, 20 PT);
+    paper()->lookup_l()->beam(sl, 20 PT);
 
     Molecule leftbeams;
     Molecule rightbeams;
@@ -220,7 +220,7 @@ Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
        Symbol dummy;
        Atom a(dummy);
        if (lhalfs)             // generates warnings if not
-           a =  paper()->lookup_p_->beam(sl, w);
+           a =  paper()->lookup_l()->beam(sl, w);
        a.translate(Offset (-w, -w * sl));
        for (int j = 0; j  < lhalfs; j++) {
            Atom b(a);
@@ -234,7 +234,7 @@ Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
        int rwholebeams = here->beams_right <? next->beams_left; 
 
        Real w = next->hindex() - here->hindex();
-       Atom a = paper()->lookup_p_->beam(sl, w + stemdx);
+       Atom a = paper()->lookup_l()->beam(sl, w + stemdx);
        
        int j = 0;
        for (; j  < rwholebeams; j++) {
@@ -245,7 +245,7 @@ Beam::stem_beams(Stem *here, Stem *next, Stem *prev)const
 
        w /= 4;
        if (rhalfs)
-           a = paper()->lookup_p_->beam(sl, w);
+           a = paper()->lookup_l()->beam(sl, w);
        
        for (; j  < rwholebeams + rhalfs; j++) {
            Atom b(a);
index 528623eed6820867c59101dfcede25efb8900145..72328b0954e9617b8280bb59899011ede0aed5b1 100644 (file)
@@ -46,7 +46,7 @@ Clef_item::brew_molecule_p()const
     String t = type;
     if  (change)
        t += "_change";
-    Symbol s = paper()->lookup_p_->clef(t);
+    Symbol s = paper()->lookup_l()->clef(t);
     Molecule*output = new Molecule(Atom(s));
     output->translate(Offset(0, paper()->internote() * y_off));
     return output;
diff --git a/lily/dynamic-reg.cc b/lily/dynamic-reg.cc
new file mode 100644 (file)
index 0000000..88f0b50
--- /dev/null
@@ -0,0 +1,79 @@
+/*
+  dynamic-reg.cc -- implement Dynamic_register
+
+  source file of the LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+#include "dynamic-reg.hh"
+#include "musicalrequest.hh"
+#include "text-item.hh"
+#include "lookup.hh"
+#include "paper-def.hh"
+
+Dynamic_register::Dynamic_register()
+{
+    dir_i_ =0;
+    post_move_processing();
+    dynamic_p_ =0;
+}
+
+void
+Dynamic_register::post_move_processing()
+{
+    dynamic_req_l_ = 0;
+}
+
+bool    
+Dynamic_register::try_request(Request * r)
+{
+    Musical_req * m = r->musical();
+    if (!m || !m->dynamic())
+       return false;
+    assert(!dynamic_req_l_);
+    dynamic_req_l_ = m->dynamic();
+    return true;
+}
+void
+Dynamic_register::process_requests()
+{
+    if(dynamic_req_l_){
+       if (dynamic_req_l_->absdynamic()) {
+           Text_def * td_p = new Text_def;
+           td_p->align_i_ = 0;
+           String loud =Dynamic_req::loudness_str(
+               dynamic_req_l_->absdynamic()->loudness_);
+           
+           td_p->text_str_ = paper()->lookup_l()->dynamic(loud).tex;
+           
+
+           td_p->style_str_ = "dynamic";
+           
+           dynamic_p_ = new Text_item(td_p, 10 ); // TODO!
+           announce_element(Staff_elem_info(dynamic_p_, dynamic_req_l_));
+       }
+    }
+}
+
+void
+Dynamic_register::pre_move_processing()
+{
+    if (dynamic_p_) {
+       typeset_element(dynamic_p_);
+       dynamic_p_ = 0;
+    }
+}
+
+bool
+Dynamic_register::acceptable_request_b(Request*r)const
+{
+    Musical_req * m = r->musical();
+    return  (m && m->dynamic());
+}
+
+void
+Dynamic_register::set_feature(Features i)
+{
+    dir_i_ = i.direction_i_;
+}
index 59f1ff5d83c0cfdc288728f995b74d11e3c066d3..fbf806edf7af918cf1e76e0e00eb5e72535a8f7c 100644 (file)
@@ -41,7 +41,7 @@ DEFAULT_PRINT(Symtables_id, Symtables, symtables);
 DEFAULT_PRINT(Staff_id, Input_staff, staff);
 DEFAULT_PRINT(M_chord_id, Music_general_chord, mchord);
 DEFAULT_PRINT(M_voice_id, Music_voice, mvoice);
-
+DEFAULT_PRINT(Request_id, Request, request);
 void
 Real_id::do_print() const
 {
@@ -54,3 +54,4 @@ Notetab_id::do_print() const
 {
     mtor << "unknown" << "\n";
 }
+
diff --git a/lily/include/dynamic-reg.hh b/lily/include/dynamic-reg.hh
new file mode 100644 (file)
index 0000000..cd500c1
--- /dev/null
@@ -0,0 +1,30 @@
+/*
+  dynamic-reg.hh -- declare Dynamic_register
+
+  source file of the LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+#ifndef DYNAMIC_REG_HH
+#define DYNAMIC_REG_HH
+
+#include "register.hh"
+
+struct Dynamic_register : Request_register {
+    int dir_i_;
+    Text_item * dynamic_p_;
+    Dynamic_req* dynamic_req_l_;
+    /* ************** */
+    Dynamic_register();
+    virtual bool try_request(Request *req_l);
+    virtual void process_requests();
+    virtual void pre_move_processing();
+    virtual void post_move_processing();
+    virtual bool acceptable_request_b(Request*) const;
+    virtual void set_feature(Features);
+    NAME_MEMBERS(Dynamic_register);
+};
+
+#endif // DYNAMIC_REG_HH
index 1aa7f7d0c4982c12ea3feec1387c78d2532a49ae..aa8d1100127f13bd2892d17c304603ed08febcd8 100644 (file)
@@ -7,6 +7,7 @@
 
 #ifndef IDENTIFIER_HH
 #define IDENTIFIER_HH
+
 #include "identparent.hh"
 #include "symtable.hh"
 #include "input-staff.hh"
 #include "notename.hh"
 #include "lookup.hh"
 #include "script-def.hh"
+#include "request.hh"
 
 #define make_id_class(Idclass, Class, accessor)        \
 struct Idclass : Identifier {\
     virtual const char *classname() { return #Class; }\
-    Idclass(String s, Class*st):Identifier(s) { data = st; }\
+    Idclass(String s, Class*st, int code):Identifier(s,code) { data = st; }\
     virtual Class* accessor(bool copy) {\
        if (copy)\
            return new Class(* (Class*) data);\
@@ -37,6 +39,7 @@ make_id_class(Staff_id, Input_staff, staff);
 make_id_class(M_chord_id, Music_general_chord, mchord);
 make_id_class(M_voice_id, Music_voice, mvoice);
 make_id_class(Notetab_id, Notename_tab, notename_tab);
+make_id_class(Request_id, Request, request);
 
 #endif // IDENTIFIER_HH
 
index 3e6d566ee7c431338ce35f977ca9ebf02065ee39..8071dcd4f549b411f0670778daf51b0fc650d670 100644 (file)
 #define IDACCESSOR( Input_staff, staff)\
     virtual Input_staff * staff(bool) { error(#Input_staff); return 0; }
 
+
 struct Identifier {
     void *data;
     String name;
+    int token_code_i_;
     
-    Identifier(String n) : name(n) { }
+    Identifier(String n, int code) : name(n) { token_code_i_ = code; }
     virtual ~Identifier() {}
 
     void print()const;
@@ -33,6 +35,8 @@ struct Identifier {
     IDACCESSOR(Lookup,lookup)
     IDACCESSOR(Real,real)
     IDACCESSOR(Notename_tab, notename_tab)
+    IDACCESSOR(Request, request)
+       
 protected:
     virtual void do_print()const=0;
 private:
index 524cdf1958da47f06dbb23410a56e97012095af8..e850586626a6aed90f6dd007ceff12baaed4acf6 100644 (file)
@@ -15,40 +15,40 @@ struct Lookup {
     /* *************** */
     void add(String, Symtable*);
     void print()const;
-    Real internote();
+    Real internote()const;
 
-    Symbol linestaff(int n, Real w);
-    Symbol fill(Box b);
-    Symbol beam_element(int,int,Real=0);
+    Symbol linestaff(int n, Real w)const;
+    Symbol fill(Box b)const;
+    Symbol beam_element(int,int,Real=0)const;
 
     /// round slope to closest TeXslope
-    Symbol beam(Real&,Real);
+    Symbol beam(Real&,Real)const;
 
     /**
       pos == 3 : 3 lines above staff (extending below note)
 
       pos == -3: below staff
       */
-    Symbol streepjes(int pos);
-
-    Symbol meter(Array<Scalar>);
-    Symbol stem(Real y1_pos, Real y2_pos);
-    Symbol rule_symbol(Real height, Real width);
-    Symbol accidental(int);
-    Symbol ball(int);
-    Symbol flag(int);
-    Symbol rest(int);
-    Symbol clef(String);
-    Symbol bar(String);
-    Symbol dots(int);
-    Symbol slur(int dy, Real &dx, int dir);
-    Symbol half_slur(int dy, Real &dx, int dir, int xpart);
-    Symbol half_slur_middlepart(Real &dx, int dir);
-    Symbol big_slur(int dy, Real &dx, int dir);
-    Symbol text(String style, String text, int align = 1);
-    Symbol script(String idx);
-    Symbol hairpin(Real & width, bool decresc);
-
+    Symbol streepjes(int pos)const;
+
+    Symbol meter(Array<Scalar>)const;
+    Symbol stem(Real y1_pos, Real y2_pos)const;
+    Symbol rule_symbol(Real height, Real width)const;
+    Symbol accidental(int)const;
+    Symbol ball(int)const;
+    Symbol flag(int)const;
+    Symbol rest(int)const;
+    Symbol clef(String)const;
+    Symbol bar(String)const;
+    Symbol dots(int)const;
+    Symbol slur(int dy, Real &dx, int dir)const;
+    Symbol half_slur(int dy, Real &dx, int dir, int xpart)const;
+    Symbol half_slur_middlepart(Real &dx, int dir)const;
+    Symbol big_slur(int dy, Real &dx, int dir)const;
+    Symbol text(String style, String text, int align = 1)const;
+    Symbol script(String idx)const;
+    Symbol hairpin(Real & width, bool decresc)const;
+    Symbol dynamic(String)const;
     Lookup();
     Lookup(Lookup const &);
     ~Lookup();
index 240b72afd9c7cb96da5ec58a8d3cdc3923d42e61..208e3dc295c336b3e445d440f6a0864e0f4a0df7 100644 (file)
@@ -19,6 +19,9 @@
  */
 struct Musical_req : virtual Request {
     virtual Skip_req* skip() { return 0; }
+    virtual Dynamic_req* dynamic() { return 0; }
+    virtual Absolute_dynamic_req * absdynamic() { return 0; }
+    virtual Subtle_req * subtle() { return 0; }
     REQUESTMETHODS(Musical_req, musical);
 };
 
@@ -177,9 +180,9 @@ struct Slur_req : Span_req {
 };
 
 
-/**Put a script above or below this ``note''. eg upbow, downbow. Why a
-request? These symbols may conflict with slurs and brackets, so this
-also a request */
+/** Put a script above or below this ``note''. eg upbow, downbow. Why
+  a request? These symbols may conflict with slurs and brackets, so
+  this also a request */
 struct Script_req : Musical_req {
     int dir_i_;
     Script_def *scriptdef_p_;
@@ -192,7 +195,31 @@ struct Script_req : Musical_req {
     Script_req(Script_req const&);
 };
 
+/** A helper in the hierarchy. 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.
+ */
+struct Subtle_req : virtual Musical_req {
+    Moment subtime_;
+    REQUESTMETHODS(Subtle_req, subtle);
+};
 
+struct Dynamic_req : Subtle_req {
+    /// for absolute dynamics
+    enum Loudness {
+       FFF, FF, F, MF, MP, P, PP, PPP
+    };
+    static String loudness_str(Loudness);
+    REQUESTMETHODS(Dynamic_req, dynamic);
+};
 
+struct Absolute_dynamic_req : Dynamic_req {
+    Loudness loudness_;
+    Absolute_dynamic_req();
+    REQUESTMETHODS(Absolute_dynamic_req, absdynamic);
+};
 
 #endif // MUSICALREQUESTS_HH
index ae557258b082a4eb2ff6a706b08e34a8f2c275bf..fba93580cb53fb30585786bd7979ecc972de60ab 100644 (file)
  constants. Most of them are related to the point-size of the fonts,
  so therefore, the lookup table for symbols is also in here.
 
- see TODO
  */
-struct Paper_def {
+class Paper_def {
     Lookup *lookup_p_;
+public:    
     String outfile;
 
     Real linewidth;
@@ -47,6 +47,7 @@ struct Paper_def {
     Real standard_height()const;
     Real note_width() const;
     void print() const;
+    const Lookup* lookup_l();  // TODO naming
     Real duration_to_dist(Moment);
 };
 
index b3d304256e9bde15b3d1389a170638b29e8b6ea9..5c766150ac2383a4a5d8a4f065b3a2270cf5bb7f 100644 (file)
@@ -26,6 +26,7 @@ class Score_walker : public PCursor<Score_column *>
     int disallow_break_count_;
     void reinit();
 public:
+    bool break_allowed_b();
     void allow_break(Staff_walker*w);
     Score_walker(Score*);
     ~Score_walker();
index dd6303ea8c5be41784eed903904967a4c1995883..2aa4b8166b91494fde4de8cbfa204514212f9785 100644 (file)
@@ -31,15 +31,15 @@ public:
 
     Moment when() const;
     void set_cols(Score_column *c1, Score_column *c2);
-    void add(Voice_element*ve);
+    void add(Voice_element*ve, PQueue<Subtle_req *, Moment> &subtle_req_pq );
     void OK() const;
     ~Staff_column();
     void typeset_breakable_items(Array<Item *> &pre_p_arr,
                                 Array<Item *> &nobreak_p_arr,
                                 Array<Item *> &post_p_arr);
     void typeset_musical_item(Item *i);
+    void setup_one_request(Request*);
 protected:
-     void setup_one_request(Request*);
 };
 
 
index 9c6264a86bd56efe113b2c45e77b17c0a9ee79bc..c07f242e31dae2aa5659ccbb46b74ea265322717 100644 (file)
@@ -12,6 +12,7 @@
 
 #include "proto.hh"
 #include "varray.hh"
+
 /// data container.
 struct Staff_elem_info {
     Staff_elem * elem_p_;
@@ -19,7 +20,6 @@ struct Staff_elem_info {
     const Voice * voice_l_;
     Array<Request_register*> origin_reg_l_arr_;
 
-
     /* *** */
     Staff_elem_info(Staff_elem*, Request*);
     Staff_elem_info();
@@ -30,6 +30,7 @@ struct Staff_info {
     Staff_walker *walk_l_;
     const Time_description *time_c_l_;
     const Rhythmic_grouping *rhythmic_c_l_;
+    bool break_allowed_b_;
 };
 
 
index f96d02c1ec2c18d3e19d63c77a537c6d0222f770..5f902c4913c89118334527592b2c6c7a4533aa63 100644 (file)
@@ -8,6 +8,8 @@
 #include "symbol.hh"
 
 struct  Symtable : public Assoc<String, Symbol> {
+    String id_str;
+    
     Symbol lookup(String)const;
     void print()const;
 };
@@ -19,7 +21,7 @@ struct Symtables : private Assoc<String, Symtable*> {
     ~Symtables();
     Symtables();
     Symtables(Symtables const&);
-    Assoc<String, Symtable*>::add;
+    void add(String, Symtable*);
     void print()const;
 };
 
index cc9c3c95b3e44088c0985dc66e74817ce51009c6..b59df7f532b8ae53c09e8d6db3615249fbc9a8b1 100644 (file)
@@ -17,7 +17,7 @@ struct Text_def  {
     char const* defined_ch_c_l_;
   
 
-    /* ****************/
+    /* *************** */
     virtual ~Text_def() {};
     bool compare(const Text_def&);
     Text_def();
index ae0b55630800943c1f638d8cf14e1b7f066acd5e..d5ff7405e16d5a642ecf7ec52b98e5e0bdd32c7e 100644 (file)
@@ -9,19 +9,26 @@
 
 #include "text-def.hh"
 #include "item.hh"
-  
-struct Text_item : Item {
+
+/**
+  print a fixed width text above or below the staff.
+ */
+class Text_item : public Item {
+    void init(Text_def* tdef_l,int staffsize_i); 
+    Text_def* tdef_p_;
+public:
+    Text_def * tdef_l();
     int pos_i_;
     int staffsize_i_;
     int dir_i_;
-    Text_def* tdef_l_;
-    
+        
     /* ***************/
+
     NAME_MEMBERS(Text_item);
     virtual void set_default_index();
     Molecule* brew_molecule_p() const;
     void do_pre_processing();
-    
+    Text_item(Text_def*,int);
     Text_item(Text_req*,int);
 };
 
index 963b1bc5785f06d7dffb6298ed89d2b8fd1c8ba9..089eab126fc497ebf045b44270debf184d83fd25 100644 (file)
@@ -56,13 +56,13 @@ Key_item::brew_molecule_p()const
     Real inter = paper()->internote();
     
     for (int i =0; i < pitch.size(); i++) {
-       Symbol s= paper()->lookup_p_->accidental(acc[i]);
+       Symbol s= paper()->lookup_l()->accidental(acc[i]);
        Atom a(s);
        a.translate(Offset(0,(c_position + pitch[i]) * inter));
        Molecule m(a);
        output->add_right(m);   
     }
-    Molecule m(paper()->lookup_p_->fill(Box(
+    Molecule m(paper()->lookup_l()->fill(Box(
        Interval(0, paper()->note_width()),
        Interval(0,0))));
     output->add_right(m);
index 6f5945a60544bfaac62a223bbbc1ce7551f78f40..10c5ee6b03c8264f949da3e429f891fb45452380 100644 (file)
@@ -12,6 +12,7 @@
 #include "input-score.hh"
 #include "parseconstruct.hh"
 #include "main.hh"
+#include "identparent.hh"
 
 %}
 
@@ -89,7 +90,7 @@ COMMENT               [%#].*\n
        Identifier * id = lookup_identifier(c);
        if (id) {               
                yylval.id = id;
-               return IDENTIFIER;
+               return id->token_code_i_;
        }
        String *sp = new String( c);
        yylval.string=sp;
index 425982120c0b839ffa42324bb59f2a614cf1361d..a0152c9f3cab4407909421d34785e800de91d6dd 100644 (file)
@@ -60,7 +60,7 @@ Local_key_item::brew_molecule_p()const
            octmol= new Molecule;
        }
        lastoct = accs[i].octave;
-       Symbol s =paper()->lookup_p_->accidental(accs[i].acc);   
+       Symbol s =paper()->lookup_l()->accidental(accs[i].acc);   
        Atom a(s);
        Real dy = (accs[i].name + c0_position) * paper()->internote();
        a.translate(Offset(0,dy));
index ffd668e75d33e72e80f676ebd497bdb35313da24..ede8af08554d3a796b994453e5f96f1b4d70741a 100644 (file)
@@ -44,7 +44,7 @@ Lookup::print()const
 }
 
 Symbol
-Lookup::text(String style, String text, int dir)
+Lookup::text(String style, String text, int dir) const
 {
     Array<String> a;
  
@@ -60,13 +60,13 @@ Lookup::text(String style, String text, int dir)
 
 
 Real
-Lookup::internote()
+Lookup::internote() const
 {
     return ball(4).dim.y.length()/2;
 }
 
 Symbol
-Lookup::ball(int j)
+Lookup::ball(int j) const
 {
     if (j > 4)
        j = 4;
@@ -76,13 +76,13 @@ Lookup::ball(int j)
 }
 
 Symbol
-Lookup::rest(int j)
+Lookup::rest(int j) const
 {
     return (*symtables_)("rests")->lookup(String(j));
 }
 
 Symbol
-Lookup::fill(Box b)
+Lookup::fill(Box b) const
 {
     Symbol s( (*symtables_)("param")->lookup("fill"));
     s.dim = b;
@@ -90,32 +90,38 @@ Lookup::fill(Box b)
 }
 
 Symbol
-Lookup::accidental(int j)
+Lookup::accidental(int j) const
 {
     return (*symtables_)("accidentals")->lookup(String(j));
 }
 
 
 Symbol
-Lookup::bar(String s)
+Lookup::bar(String s) const
 {
     return (*symtables_)("bars")->lookup(s);
 }
 
 Symbol
-Lookup::script(String s)
+Lookup::script(String s) const
 {
     return (*symtables_)("scripts")->lookup(s);
 }
 
 Symbol
-Lookup::clef(String s)
+Lookup::dynamic(String s) const
+{
+    return (*symtables_)("dynamics")->lookup(s);
+}
+
+Symbol
+Lookup::clef(String s) const
 {
     return (*symtables_)("clefs")->lookup(s);
 }
  
 Symbol
-Lookup::dots(int j)
+Lookup::dots(int j) const
 {
     if (j>3)
        error("max 3 dots");    // todo
@@ -123,13 +129,13 @@ Lookup::dots(int j)
 }
 
 Symbol
-Lookup::flag(int j)
+Lookup::flag(int j) const
 {
     return (*symtables_)("flags")->lookup(j);
 }
 
 Symbol
-Lookup::streepjes(int i)
+Lookup::streepjes(int i) const
 {
     assert(i);
     
@@ -153,7 +159,7 @@ Lookup::streepjes(int i)
 }
 
 Symbol
-Lookup::hairpin(Real &wid, bool decresc)
+Lookup::hairpin(Real &wid, bool decresc) const
 {
     int idx = int(rint(wid / 6 PT));
     if(!idx) idx ++;
@@ -169,7 +175,7 @@ Lookup::hairpin(Real &wid, bool decresc)
 }
 
 Symbol
-Lookup::linestaff(int lines, Real wid) 
+Lookup::linestaff(int lines, Real wid) const
 {
     Symbol s;
     s.dim.x = Interval(0,wid);
@@ -188,7 +194,7 @@ Lookup::linestaff(int lines, Real wid)
 
 
 Symbol
-Lookup::meter(Array<Scalar> a)
+Lookup::meter(Array<Scalar> a) const
 {
     Symbol s;
     s.dim.x = Interval( 0 PT, 10 PT);
@@ -200,7 +206,7 @@ Lookup::meter(Array<Scalar> a)
 
 
 Symbol
-Lookup::stem(Real y1,Real y2)
+Lookup::stem(Real y1,Real y2) const
 {
     if (y1 > y2) {
        Real t = y1;
index c0adac7b63d8e7a968f6376f77f9284ca614bae0..cb8c7547e43d9180264935af3892a95c3714a47f 100644 (file)
@@ -22,6 +22,6 @@ Lyric_item::do_pre_processing()
 {
 
     // test context-error
-    if ( tdef_l_->text_str_.index_i( "Gates" ) >=0)// :-)
-       warning( "foul word", tdef_l_->defined_ch_c_l_ );
+    if ( tdef_l()->text_str_.index_i( "Gates" ) >=0)// :-)
+       warning( "foul word", tdef_l()->defined_ch_c_l_ );
 }
index 94f6b6c5e96ed756324998a9873d96b6945a5c09..c16d5d3d3f30c7c5843af322fa96c562e16df70d 100644 (file)
@@ -12,7 +12,7 @@ Meter::Meter(Array<Scalar>a)
 Molecule*
 Meter::brew_molecule_p()const
 {
-    Symbol s = paper()->lookup_p_->meter(args);
+    Symbol s = paper()->lookup_l()->meter(args);
     return new Molecule(Atom(s));
 }
 
index 7da6dddec843d7413426c724287cb7aea2763ee9..9c9179c856d4237b5aa65df59d402b5a4bc1873f 100644 (file)
@@ -5,7 +5,7 @@
 #include "assoc-iter.hh"
 #include "lexer.hh"
 #include "input-file.hh"
-#include "parser.hh"
+#include "out/parser.hh"
 #include "keyword.hh"
 #include "assoc.hh"
 #include "lexer.hh"
@@ -20,8 +20,9 @@ static Keyword_ent the_key_tab[]={
     "clef", CLEF,
     "cm", CM_T,
     "command", COMMAND,
-    "commands", COMMANDS,
+    "commands", COMMANDS,    
     "duration", DURATIONCOMMAND,
+    "dynamic", DYNAMIC,
     "geometric", GEOMETRIC,
     "goto", GOTO,
     "in", IN_T,
index 722b231e6837fa123c54f2a6383910cfac3401bb..4d0157abe9aa4271b5ee0fcb01c1458cc3517355 100644 (file)
@@ -48,11 +48,11 @@ Notehead::brew_molecule_p() const return out;
     Paper_def *p = paper();
 
     Real dy = p->internote();
-    Symbol s = p->lookup_p_->ball(balltype);
+    Symbol s = p->lookup_l()->ball(balltype);
     
     out = new Molecule(Atom(s));
     if (dots) {
-       Symbol d = p->lookup_p_->dots(dots);
+       Symbol d = p->lookup_l()->dots(dots);
        Molecule dm;
        dm.add(Atom(d));
        if (!(position %2))
@@ -64,7 +64,7 @@ Notehead::brew_molecule_p() const return out;
     if (streepjes) {
        int dir = sign(position);
        int s =(position<-1) ? -((-position)/2): (position-staff_size)/2;
-       Symbol str = p->lookup_p_->streepjes(s);
+       Symbol str = p->lookup_l()->streepjes(s);
        Molecule sm;
        sm.add(Atom(str));
        if (position % 2)
index b49a53fc8e488298454cf5139f0b24016449550b..6063347e88afd08e796bc24cfec6b94dcc59c10d 100644 (file)
@@ -89,3 +89,8 @@ Paper_def::print() const
     mtor << "}\n";
 #endif
 }
+const Lookup*
+Paper_def::lookup_l()
+{
+    return lookup_p_;
+}
index ba9703e4b8be61597d131ea3ff6c3d78c35c427b..ebec63fbefe15feddea069cc597865d552392508 100644 (file)
@@ -65,7 +65,7 @@ int fatal_error_i = 0;
     Text_def * textdef;
 }
 
-%token VOICE STAFF SCORE TITLE  BAR  OUTPUT MULTIVOICE
+%token VOICE STAFF SCORE TITLE  BAR  OUTPUT MULTIVOICE DYNAMIC
 %token CM_T IN_T PT_T MM_T PAPER WIDTH METER UNITSPACE SKIP COMMANDS COMMAND
 %token GEOMETRIC START_T DURATIONCOMMAND OCTAVECOMMAND
 %token KEY CLEF  TABLE  VOICES STEM
@@ -74,7 +74,7 @@ int fatal_error_i = 0;
 %token  GOTO
 %token MIDI TEMPO
 
-%token <id>  IDENTIFIER
+%token <id>  IDENTIFIER REAL_IDENTIFIER REQUEST_IDENTIFIER 
 %token <string> PITCHMOD DURATION RESTNAME
 %token <ii> NOTENAME 
 %token <real> REAL 
@@ -98,7 +98,7 @@ int fatal_error_i = 0;
 %type <staff> staff_block staff_init staff_body
 %type <i> int
 %type <intvec> intastint_list
-%type <request> post_request pre_request command_req
+%type <request> post_request pre_request command_req 
 %type <string> pitchmod
 %type <music> music 
 %type <chord> music_chord music_chord_body
@@ -113,7 +113,7 @@ int fatal_error_i = 0;
 %type <notename_tab> notename_tab notename_tab_body
 %type <i> script_dir
 %type <script> script_definition script_body mudela_script
-%type <request> script_req textscript_req
+%type <request> script_req textscript_req dynamic_req basic_request
 %type <textdef> mudela_text
 
 
@@ -146,35 +146,39 @@ declarable_identifier:
 
 declaration:
        declarable_identifier '=' staff_block  {
-               $$ = new Staff_id(*$1, $3);
+               $$ = new Staff_id(*$1, $3, IDENTIFIER);
                delete $1; 
        }
        | declarable_identifier '=' music_voice {
-               $$ = new M_voice_id(*$1, $3);
+               $$ = new M_voice_id(*$1, $3, IDENTIFIER);
                delete $1;
        }
        | declarable_identifier '=' script_definition {
-               $$ = new Script_id(*$1, $3);
+               $$ = new Script_id(*$1, $3, IDENTIFIER);
                delete $1;
        }
        | declarable_identifier '=' music_chord  {
-               $$ = new M_chord_id(*$1, $3);
+               $$ = new M_chord_id(*$1, $3, IDENTIFIER);
                delete $1;
        }
        | declarable_identifier '=' symtables {
-               $$ = new Lookup_id(*$1, $3);
+               $$ = new Lookup_id(*$1, $3, IDENTIFIER);
                delete $1;
        }
        | declarable_identifier '=' notename_tab {
-               $$ = new Notetab_id(*$1, $3);
+               $$ = new Notetab_id(*$1, $3, IDENTIFIER);
                delete $1;
        }
        | declarable_identifier '=' real        {
-               $$ = new Real_id(*$1, new Real($3));
+               $$ = new Real_id(*$1, new Real($3), REAL_IDENTIFIER);
                delete $1;
        }
        | declarable_identifier error '}' {
 
+       }
+       | declarable_identifier '=' basic_request {
+               $$ = new Request_id(*$1, $3, REQUEST_IDENTIFIER);
+               delete $1;
        }
        ;
 
@@ -328,11 +332,14 @@ music_voice:  MUSIC '{' music_voice_body '}'      { $$ = $3; }
        ;
 
 music_voice_body:
-       /* */   {
+       IDENTIFIER {
+               $$ = $1->mvoice(true);
+       }
+       | /* */         {
                $$ = new Music_voice;
        }
-       | music_voice_body IDENTIFIER {
-               $$->concatenate($2->mvoice(true));
+       | music_voice_body '+' IDENTIFIER {
+               $$->concatenate($3->mvoice(true));
        }
        | music_voice_body full_element {
                $$->add_elt($2);
@@ -350,14 +357,17 @@ music_chord:  '{' music_chord_body '}'    { $$ = $2; }
        ;
 
 music_chord_body:
-       /* */   {
+       IDENTIFIER {
+               $$=$1->mchord(true);
+       }
+       | /* */ {
                $$ = new Voice_group_chord;
        }
        | MULTIVOICE {
                $$ = new Multi_voice_chord;
        }
-       | music_chord_body IDENTIFIER {
-               $$->concatenate($2->mchord(true));
+       | music_chord_body '+' IDENTIFIER {
+               $$->concatenate($3->mchord(true));
        }
        | music_chord_body music {
                $$->add($2);
@@ -369,6 +379,11 @@ music_chord_body:
        }
        ;
 
+basic_request:
+       command_req
+       | pre_request
+       | post_request
+       ;
 
 /*
        VOICE ELEMENTS
@@ -464,6 +479,18 @@ post_request:
        }
        | script_req
        | textscript_req
+       | dynamic_req
+       | REQUEST_IDENTIFIER    {
+               $$ = $1->request(false)->clone();
+       }
+       ;
+
+dynamic_req:
+       DYNAMIC '{' int '}'     {
+               Absolute_dynamic_req *ad_p = new Absolute_dynamic_req;
+               ad_p ->loudness_ = $3;
+               $$ =ad_p;
+       }
        ;
 
 close_plet_parens:
@@ -698,7 +725,7 @@ real:
        | REAL          {
                $$ = $1;
        }
-       | IDENTIFIER            {
+       | REAL_IDENTIFIER               {
                $$ = * $1->real(0);             
        }
        ;
index 1f4a8b68c8334ebda353f65e311c8dd0289f7a9e..989a0f92d7e74b7ac4afd0c256e7b451ac563369 100644 (file)
@@ -120,7 +120,7 @@ PScore::output(Tex_stream &ts)
 {
     int l=1;
 
-    ts << "\n "<<  paper_l_->lookup_p_->texsetting << "%(Tex id)\n";
+    ts << "\n "<<  paper_l_->lookup_l()->texsetting << "%(Tex id)\n";
     for (iter_top(lines,lic); lic.ok(); lic++) {
        ts << "% line of score no. " << l++ <<"\n";
        ts << lic->TeXstring();
index ecfe68c881a3470d4504b08c3cc5f9a15d1b5371..d6bae873b7c047bd1ebc025d8edc0d792e983af4 100644 (file)
@@ -71,7 +71,9 @@ Spacing_req::Spacing_req()
 void
 Spacing_req::do_print()const
 {
+#ifndef NPRINT
     mtor << "next " << next << "dist " << distance << "strength\n";
+#endif
 }
 
 void
@@ -298,3 +300,45 @@ Request::voice_l()
     else
        return (Voice*)elt_l_->voice_l_;
 }
+/* *************** */
+
+void
+Subtle_req::do_print() const
+{
+    mtor << " subtime " <<  subtime_;
+}
+
+void
+Dynamic_req::do_print() const
+{
+    Subtle_req::do_print();
+}
+
+void
+Absolute_dynamic_req::do_print() const
+{
+    Dynamic_req::do_print();
+    mtor << " loudness_" <<loudness_;
+}
+
+String
+Dynamic_req::loudness_str(Loudness l) 
+{
+    switch (l) {
+    case FFF: return "fff";
+    case FF: return "ff";
+    case F: return "f";
+    case MF: return "mf";
+    case MP: return "mp";
+    case P: return "p";
+    case PP: return "pp";
+    case PPP: return "ppp";
+    }
+    assert(false);
+    return "";
+}
+
+Absolute_dynamic_req::Absolute_dynamic_req()
+{
+    loudness_ = MF;
+}
index 0e4394a3c6f5694fb7c5d3218e1cd2dd33e7c45c..39347b1d5bc1f7bf8628d3ab8818a2b0bf3d134d 100644 (file)
@@ -28,11 +28,11 @@ Rest::brew_molecule_p()const
     Paper_def *p =paper();
 
     Symbol s;
-    s = p->lookup_p_->rest(balltype);
+    s = p->lookup_l()->rest(balltype);
     
     Molecule *m = new Molecule(Atom(s));
     if (dots) {
-       Symbol d =p->lookup_p_->dots(dots);
+       Symbol d =p->lookup_l()->dots(dots);
        Molecule dm;
        dm.add(Atom(d));
        m->add_right(dm);
index d011c331ad4f69bb2ee742d9fe357fa4aa293cb9..7221750c02eaa3d81e85a974c540047ac8975468 100644 (file)
@@ -51,11 +51,10 @@ Score_walker::operator ++(int )
     if (ok() && ptr()->when() == last)
        PCursor<Score_column *>::operator++(0);
     reinit();
-    if (!ok())
-       return;
+    bool last_b =  (!ok());    // urgh
     for (int i=0; i< walker_p_arr_.size(); i++) {
        if (walker_p_arr_[i]->ok() &&
-           walker_p_arr_[i]->when() < when()) {
+           (last_b || walker_p_arr_[i]->when() < when())) {
 
            walker_p_arr_[i]->operator++(0);
        }
@@ -82,6 +81,12 @@ Score_walker::allow_break(Staff_walker*w)
     }
 }
 
+bool
+Score_walker::break_allowed_b()
+{
+    return !disallow_break_count_;
+}
+
 Moment
 Score_walker::when()
 {
index 2a31133c331d121f75c33fc3c024eba0e1191ec5..1bcbd518a8eeb899f6b562d1502d3ab285eac778 100644 (file)
@@ -102,7 +102,7 @@ Symbol
 Script::symbol()const
 {
     String preidx_str = (symdir < 0) ?"-" :"";
-    return paper()->lookup_p_->script(preidx_str + specs_l_->symidx);
+    return paper()->lookup_l()->script(preidx_str + specs_l_->symidx);
 }
 
 void
index ba77a6948e710a3ac129879974bcc876c019a240..29623c0d0cade9e7d3b3f19415fa7b53a7d44097 100644 (file)
@@ -122,7 +122,7 @@ Slur::brew_molecule_p() const
     w+= (right_off.x - left_off.x) * nw_f ;
     Real round_w = w;          // slur lookup rounds the slurwidth .
     
-    Symbol sl = paper()->lookup_p_->slur(dy , round_w, dir_i_);
+    Symbol sl = paper()->lookup_l()->slur(dy , round_w, dir_i_);
 
     Real error = w-round_w;
     
index 0dd969ab0a222f0e339b494a2d474e62a229bbcc..87ceab5ebff78c716b66b475f9d33f0296031fb2 100644 (file)
@@ -19,6 +19,7 @@
 #include "item.hh"
 #include "pcol.hh"
 #include "voice-element.hh"
+#include "pqueue.hh"
 
 void
 Staff_column::OK() const
@@ -37,7 +38,8 @@ Staff_column::when() const
 }
 
 void
-Staff_column::add(Voice_element*ve)
+Staff_column::add(Voice_element*ve,
+                 PQueue<Subtle_req *, Moment> &subtle_req_pq )
 {
     for (iter_top(ve->reqs,j); j.ok(); j++) {
        if (j->command()) {
@@ -54,8 +56,17 @@ Staff_column::add(Voice_element*ve)
            if (j->rhythmic()) {
                musical_column_l_->add_duration(j->rhythmic()->duration());
            }
-           if (!j->musical()->skip())
-               setup_one_request(j);
+           if (j->musical()) {
+               Musical_req*m = j->musical();
+               if(m->skip())
+                   continue;
+               Subtle_req * s = m->subtle() ;
+               if (s&& s->subtime_) {
+                   subtle_req_pq.enter(s, s->subtime_ + when());
+                   continue ; 
+               }
+           }
+           setup_one_request(j);
        }
     }
 }
index a3ad17d07665d803d1ef76bb1fe647045f512693..71fa8a813fa873f744b8005c019dfd24151c8ad0 100644 (file)
@@ -1,3 +1,14 @@
+/*
+  staff.cc -- implement Staff
+
+  source file of the LilyPond music typesetter
+
+  (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+*/
+
+
+
 #include "proto.hh"
 #include "plist.hh"
 #include "staff.hh"
@@ -11,7 +22,7 @@
 #include "musicalrequest.hh"
 #include "commandrequest.hh" // todo
 #include "midi-stream.hh"
-
+#include "pqueue.hh"
 void
 Staff::add(PointerList<Voice*> const &l)
 {
@@ -77,25 +88,46 @@ Staff::get_col(Moment w, PCursor<Staff_column*> *last)
     return i;
 }
 
-/**
-  put all stuff grouped vertically in the Staff_cols.
-  Do the preprarations for walking the cols. not virtual
-    */
+/** put all stuff grouped vertically in the Staff_cols.  Do the
+  preprarations for walking the cols. not virtual */
 void
 Staff::setup_staffcols()
-{    
+{
+    PQueue<Subtle_req *, Moment> subtle_req_pq;
+    
     for (iter_top(voice_list_,i); i.ok(); i++) {
        PCursor<Staff_column*> last(cols_);
        Moment now = i->start;
-       for (iter_top(i->elts,j); j.ok(); j++) {
+       iter_top(i->elts,j);
+       while( j.ok()) {
            
-           Staff_column *s_l= get_col(now, &last);
-           assert(now == s_l->when());
-           s_l->add(j);
-           now += j->duration;     
-       }
+           Moment next = now;
+           if (subtle_req_pq.size())
+               next = next <? subtle_req_pq.front_idx();
 
+           Staff_column *s_l= get_col(next, &last);
+
+           while (subtle_req_pq.size()
+                  && subtle_req_pq.front_idx() == s_l->when()) {
+               s_l->setup_one_request(subtle_req_pq.get()); // ugh!
+           }
+           if(next == now) {
+               s_l->add(j, subtle_req_pq); 
+               now += j->duration;
+               j++;
+           }
+       }
+       
+    }
+    PCursor<Staff_column*> last(cols_);
+    
+    while (subtle_req_pq.size()) {
+       Moment front =subtle_req_pq.front_idx();
+       Staff_column *s_l = get_col(front, &last);
+       while(subtle_req_pq.size() && subtle_req_pq.front_idx() == front)
+           s_l->setup_one_request(subtle_req_pq.get()); // ugh!
     }
+       
     OK();
 }
 
index 631a5f3673e5c004733b6de54541ddde8c23b927..ad639e9c2d87f28a1c965b4b1671b4d003f9a449 100644 (file)
@@ -26,7 +26,7 @@ Staff_symbol::do_print()const
 Molecule*
 Staff_symbol::brew_molecule_p() const
 {
-    Atom a  = paper()->lookup_p_->linestaff(no_lines_i_, width().length());
+    Atom a  = paper()->lookup_l()->linestaff(no_lines_i_, width().length());
     return new Molecule(a);
 }
 
index 74ea4b57fcf0f500e46353139a5b356357bd30c3..0950ada3717f2839e1929c0f4d9c99fcb63a60bd 100644 (file)
@@ -158,7 +158,7 @@ Stem::width()const
     if (!print_flag || abs(flag) <= 4)
        return Interval(0,0);   // TODO!
     Paper_def*p= paper();
-    Interval r(p->lookup_p_->flag(flag).dim.x);
+    Interval r(p->lookup_l()->flag(flag).dim.x);
     r+= stem_xoffset;
     return r;
 }
@@ -172,13 +172,13 @@ Stem::brew_molecule_p()const return out;
     Paper_def *p =paper();
 
     Real dy = p->internote();
-    Symbol ss =p->lookup_p_->stem(bot*dy,top*dy);
+    Symbol ss =p->lookup_l()->stem(bot*dy,top*dy);
 
     
     out = new Molecule(Atom(ss));
 
     if (print_flag&&abs(flag) > 4){
-       Symbol fl = p->lookup_p_->flag(flag);
+       Symbol fl = p->lookup_l()->flag(flag);
        Molecule m(fl);
        if (flag < -4){         
            out->add_bottom(m);
index d55e9ac59bdd977572423dc035259af53d89ddad..d49a1d34b80cf745f07d8a1bbb225f7751da2095 100644 (file)
@@ -31,7 +31,7 @@ Symtable::lookup(String s) const
     if (elt_query(s))
        return (*this)[s];
     else {
-       error( "Unknown symbol `" +s+"'\n");
+       error( "Symtable `" + id_str+ "\': unknown symbol `" +s+"'\n");
     }
     Symbol sy;                 // unreachable
     return sy;
@@ -59,3 +59,9 @@ Symtable::print() const
     }
 }
        
+void
+Symtables::add(String s, Symtable*p)
+{
+    p-> id_str = s;
+    Assoc<String, Symtable*>::add(s,p);
+}
index c9f3c954812171495e0b53087f68f7a62b90a731..194d97384a25cd187a73c49749eed04fdc2b4ac9 100644 (file)
@@ -14,7 +14,7 @@
 #include "lookup.hh"
 
 Symbol
-Lookup::beam_element(int sidx, int widx, Real slope)
+Lookup::beam_element(int sidx, int widx, Real slope) const
 {
     Symbol bs=(*symtables_)("beamslopes")->lookup("slope");
     
@@ -48,7 +48,7 @@ slope_index(Real &s)
 }
 
 Symbol
-Lookup::rule_symbol(Real height, Real width)
+Lookup::rule_symbol(Real height, Real width) const
 {
     Symbol bs=(*symtables_)("beamslopes")->lookup("horizontal");    
     Array<String> args;
@@ -61,7 +61,7 @@ Lookup::rule_symbol(Real height, Real width)
 }
 
 Symbol
-Lookup::beam(Real &slope, Real width)
+Lookup::beam(Real &slope, Real width) const
 {        
     int sidx = slope_index(slope);
     if (!slope)
index 71cded95299cdebe83f02da7c43dadc746320640..2cbe6e7acd2f3e88872e1444d2b3804988cf7dde 100644 (file)
@@ -26,7 +26,7 @@ char direction_char(int y_sign)
 }
 
 Symbol
-Lookup::half_slur_middlepart(Real &dx, int dir)
+Lookup::half_slur_middlepart(Real &dx, int dir) const
 {
     if (dx >= 400 PT) {// todo
        WARN<<"halfslur too large" <<print_dimen(dx)<< "shrinking (ugh)\n";
@@ -61,7 +61,7 @@ Lookup::half_slur_middlepart(Real &dx, int dir)
     return s;
 }
 Symbol
-Lookup::half_slur(int dy, Real &dx, int dir, int xpart)
+Lookup::half_slur(int dy, Real &dx, int dir, int xpart) const
 {
     Real orig_dx = dx;
     if (!xpart)
@@ -111,7 +111,7 @@ Lookup::half_slur(int dy, Real &dx, int dir, int xpart)
 }
 
 Symbol
-Lookup::slur (int dy , Real &dx, int dir)
+Lookup::slur (int dy , Real &dx, int dir) const
 {
     assert(dx >=0 && abs(dir) <= 1);
     int y_sign = sign(dy);
@@ -176,7 +176,7 @@ Lookup::slur (int dy , Real &dx, int dir)
 }
 
 Symbol
-Lookup::big_slur(int dy , Real &dx, int dir)
+Lookup::big_slur(int dy , Real &dx, int dir) const
 {
     assert(dx >= 24 PT);
     Real slur_extra =abs(dy)  /2.0 + 2; 
index d67622e141c871b183e522d15e7366b4beab0cb1..b440003fd2b5044e88fc78f86df919fccd2694f9 100644 (file)
@@ -20,7 +20,7 @@ Text_def::compare(const Text_def&def)
 Atom
 Text_def::create_atom(Paper_def*p) const
 {
-    return p->lookup_p_->text(style_str_, text_str_, -align_i_);
+    return p->lookup_l()->text(style_str_, text_str_, -align_i_);
 }
 
 void
index 7cdab7c71fce06d08604e6f7e2d080327ebe046c..b0f6ab410762ed0ee2d4ed2cce16dbb8885cf2bd 100644 (file)
@@ -7,22 +7,43 @@
 */
 
 
-  #include "musicalrequest.hh"
+#include "musicalrequest.hh"
 #include "paper-def.hh"
 #include "text-item.hh"
 #include "stem.hh"
 #include "molecule.hh"
 #include "lookup.hh"
 
+Text_item::Text_item(Text_def *tdef_l, int staffsize_i)
+{
+    dir_i_ =-1;
+    init(tdef_l, staffsize_i);  
+}
 
+Text_def*
+Text_item::tdef_l()
+{
+    return tdef_p_;
+}
 
-Text_item::Text_item(Text_req* treq_l, int staffsize_i)
+Text_item::~Text_item()
+{
+    delete tdef_p_;
+}
+
+void
+Text_item::init(Text_def *tdef_l, int staffsize_i)
 {
     staffsize_i_ = staffsize_i;
+    tdef_p_ = new Text_def (*tdef_l);
+}
+
+Text_item::Text_item(Text_req* treq_l, int staffsize_i)
+{
+    init(treq_l->tdef_p_, staffsize_i);
     dir_i_ = treq_l->dir_i_;
     if (!dir_i_)
        dir_i_ = -1;
-    tdef_l_ = treq_l->tdef_p_;
 }
 
 void
@@ -41,7 +62,7 @@ Text_item::do_pre_processing()
 Molecule*
 Text_item::brew_molecule_p() const
 {
-    Molecule* mol_p = new Molecule(tdef_l_->create_atom(paper()));
+    Molecule* mol_p = new Molecule(tdef_p_->create_atom(paper()));
     mol_p->translate(Offset(0, pos_i_ * paper()->internote()));
 
     if(dir_i_<0)
index 430b0cf33f2ff8746672546aa32d029828282e44..d789fda2b15c92ac20d81d3703bc40d9660d5399 100644 (file)
 #include "complex-walker.hh"
 #include "commandrequest.hh"
 #include "debug.hh"
+#include "dynamic-reg.hh"
 
 static int temp_id_count;
 
 Voice_group_registers::Voice_group_registers(String id)
 {
+    add(new Dynamic_register);
     add(new Text_register);
     add(new Stem_beam_register);
     add(new Script_register);
index 0c408025012b2cf5380369419419e2c30ab4b0af..ab242065d54a45426b32e5ba94ce4ebccb9f48c3 100644 (file)
@@ -21,7 +21,7 @@
 #include "voice-group-regs.hh"
 #include "voice-regs.hh"
 #include "commandrequest.hh"
-
+#include "score-walker.hh"
 
 Walker_registers::Walker_registers(Complex_walker *w)
 {
@@ -162,11 +162,14 @@ Walker_registers::try_request(Request * r)
 Staff_info
 Walker_registers::get_staff_info() return inf;
 {
+    if (walk_l_->score_walk_l_)        // we get called ctors
+       inf.break_allowed_b_ = walk_l_->score_walk_l_->break_allowed_b();
     inf.c0_position_i_ = &walk_l_->c0_position_i_;
     inf.walk_l_ = walk_l_;
     inf.time_c_l_ = &walk_l_->time_;
     inf.rhythmic_c_l_ = walk_l_->default_grouping;
 }
+
 Paper_def*
 Walker_registers::paper()const
 {
diff --git a/make/ACVariables.make.in b/make/ACVariables.make.in
new file mode 100644 (file)
index 0000000..3a07df7
--- /dev/null
@@ -0,0 +1,16 @@
+# -*-Makefile-*-
+
+# @AUTOHEADER@
+
+#CXXFLAGS=@CXXFLAGS@
+#CXX=@CXX@
+bindir=@bindir@
+includedir=@includedir@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+DEFS=@DEFS@
+#SET_MAKE=@SET_MAKE@
+DEFINES=@DEFINES@
+COMPILEINFO=@COMPILEINFO@
+BISON=@BISON@
+FLEX=@FLEX@
index 2699f6140e150cb6b4c26d8594ba5565310368c9..eef8cbf3bde4d894cbb22329b7449b2d32e089a3 100644 (file)
@@ -31,7 +31,7 @@ MAKEFILES = $(shell ls *.make)
 
 # list of distribution files:
 #
-DISTFILES = Makefile $(MAKEFILES)
+DISTFILES = configure.in ACVariables.make.in Makefile lilypond.spec $(MAKEFILES)
 #
 
 # generic variables:
diff --git a/make/lilypond.spec b/make/lilypond.spec
new file mode 100644 (file)
index 0000000..f7b5056
--- /dev/null
@@ -0,0 +1,40 @@
+Description: LilyPond is a program which converts a music-script (mudela) into\
+TeX output, or MIDI to produce multi-staff scores. Feature include multiple\
+meters, clefs, keys, lyrics, versatile input-language, cadenzas\
+beams, slurs, triplets\
+multiple voices within one staff.
+Name: lilypond
+Version: 0.0.39.hwn2
+Release: 1
+Copyright: GPL
+Group: Applications/Publishing
+Source0: pcnov095.win.tue.nl:/pub/lilypond/lilypond-0.0.39.hwn2.tar.gz
+Summary: A preprocessor to make TeX typeset music.
+
+%prep
+%setup
+%build
+PREFIX=/usr/lib ./configure
+make all OPTIFLAG="-O2" 
+%install
+make install
+%files
+%doc Documentation/README.txt Documentation/CodingStyle.txt
+%doc Documentation/lilygut.txt Documentation/lilyinput.txt
+%doc Documentation/error.txt Documentation/faq.txt Documentation/index.txt
+%doc Documentation/language.txt Documentation/lelie_logo.png
+/usr/bin/lilypond
+/usr/bin/mi2mu
+/usr/lib/lilypond/init/bare.ini
+/usr/lib/lilypond/init/dutch.ini
+/usr/lib/lilypond/init/english.ini
+/usr/lib/lilypond/init/script.ini
+/usr/lib/lilypond/init/swedish.ini
+/usr/lib/lilypond/init/symbol.ini
+/usr/lib/lilypond/init/table_sixteen.ini
+/usr/lib/lilypond/init/table_twenty.ini
+/usr/lib/lilypond/titledefs.tex
+/usr/lib/lilypond/lilyponddefs.tex
+
+
+
index 586aabb88d36355106f7e00f754d9f8e0f2227a8..2237f638066816e15026d8f63f64ec630e1f6993 100644 (file)
 \def\dynf{f\kern-.1ex}
 \def\dynm{f\kern-.15ex}
 \def\dynp{p\kern-.15ex}
-\def\ppp{\dynfont\dynp\dynp p}
-\def\pp{\dynfont\dynp p}
-\def\p{\dynfont p}
-\def\mp{\dynfont\dynm p}
-\def\mf{\dynfont\dynm f}
-\def\f{\dynfont f}
-\def\ff{\dynfont\dynf f}
-\def\fff{\dynfont\dynf\dynf f}
+
+\def\dynppp{\dynfont\dynp\dynp p}
+\def\dynpp{\dynfont\dynp p}
+\def\dynp{\dynfont p}
+\def\dynmp{\dynfont\dynm p}
+\def\dynmf{\dynfont\dynm f}
+\def\dynf{\dynfont f}
+\def\dynff{\dynfont\dynf f}
+\def\dynfff{\dynfont\dynf\dynf f}
 
 \def\slurcharh#1{{\slurhfont\char#1}}
 \def\slurcharu#1{{\slurufont\char#1}}
 \def\decrescendosym#1{\count0=116\advance\count0 by #1}
 \def\settext#1{\textfont #1}
 \def\setitalic#1{\italicfont #1}
+\def\setdynamic#1{\dynfont #1}