From: fred Date: Sun, 24 Mar 2002 19:34:34 +0000 (+0000) Subject: lilypond-0.0.40 X-Git-Tag: release/1.5.59~5230 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=c26783b41c04b86e955092520c1cca5be9bbd2f1;p=lilypond.git lilypond-0.0.40 --- diff --git a/ANNOUNCE b/ANNOUNCE index 48bbdd0cbd..df31a15ba0 100644 --- a/ANNOUNCE +++ b/ANNOUNCE @@ -1,3 +1,5 @@ +[Draft version] +[Draft version] CALL FOR HACKERS: LilyPond, the Music Typesetter diff --git a/Documentation/index.pod b/Documentation/index.pod index f473d9c456..4e12783de1 100644 --- a/Documentation/index.pod +++ b/Documentation/index.pod @@ -86,4 +86,15 @@ MIDI output > The DOC++ documentation of the C++ sources. \ No newline at end of file +> + +=item * + +Get it! + + +=head1 AUTHOR + +Han-Wen Nienhuys , for this page diff --git a/TODO b/TODO index 87d3ef806c..b3d03f91ba 100644 --- 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. diff --git a/bin/genheader b/bin/genheader index 7c36afe0ae..fba3c1559e 100755 --- a/bin/genheader +++ b/bin/genheader @@ -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"; diff --git a/bin/make_patch b/bin/make_patch index 290e2e33da..f74f1ea0cd 100755 --- a/bin/make_patch +++ b/bin/make_patch @@ -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) diff --git a/bin/make_website b/bin/make_website index 844e60bbd1..5b360b94fb 100755 --- a/bin/make_website +++ b/bin/make_website @@ -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"; diff --git a/flower/lib/dstream.cc b/flower/lib/dstream.cc index e6fdbc0e4d..1197dd79e7 100644 --- a/flower/lib/dstream.cc +++ b/flower/lib/dstream.cc @@ -1,3 +1,5 @@ + + #include #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; } diff --git a/flower/lib/include/fproto.hh b/flower/lib/include/fproto.hh index 8c6fda680e..bf8a22211c 100644 --- a/flower/lib/include/fproto.hh +++ b/flower/lib/include/fproto.hh @@ -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 struct Array; @@ -19,7 +26,9 @@ template struct Cursor; template struct PCursor; template struct Link; template struct Handle; -templatestruct Interval_t; +template struct Interval_t; +template struct PQueue; + #include "real.hh" typedef Interval_t Interval; diff --git a/init/dynamic.ini b/init/dynamic.ini new file mode 100644 index 0000000000..000439dce6 --- /dev/null +++ b/init/dynamic.ini @@ -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 } + diff --git a/init/symbol.ini b/init/symbol.ini index 7de1e0f521..cc0f13d399 100644 --- a/init/symbol.ini +++ b/init/symbol.ini @@ -1,5 +1,5 @@ - +include "dynamic.ini" include "dutch.ini" # do not include init/ path include "script.ini" include "table_sixteen.ini" diff --git a/init/table_sixteen.ini b/init/table_sixteen.ini index 1b7b379f67..240eae0b8b 100644 --- a/init/table_sixteen.ini +++ b/init/table_sixteen.ini @@ -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{%}{%}" } } diff --git a/input/cadenza.ly b/input/cadenza.ly index 76095fc06e..ecfda88354 100644 --- a/input/cadenza.ly +++ b/input/cadenza.ly @@ -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 +} diff --git a/lib/include/proto.hh b/lib/include/proto.hh index e9d3e60d38..4b3a8f91c5 100644 --- a/lib/include/proto.hh +++ b/lib/include/proto.hh @@ -10,10 +10,7 @@ #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; diff --git a/lily/bar.cc b/lily/bar.cc index 32a7cd5fe6..8b831d206a 100644 --- a/lily/bar.cc +++ b/lily/bar.cc @@ -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; } diff --git a/lily/beam.cc b/lily/beam.cc index 64f3e3cf77..b9fbd0a28c 100644 --- a/lily/beam.cc +++ b/lily/beam.cc @@ -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 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); diff --git a/lily/clef-item.cc b/lily/clef-item.cc index 528623eed6..72328b0954 100644 --- a/lily/clef-item.cc +++ b/lily/clef-item.cc @@ -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 index 0000000000..88f0b502f4 --- /dev/null +++ b/lily/dynamic-reg.cc @@ -0,0 +1,79 @@ +/* + dynamic-reg.cc -- implement Dynamic_register + + source file of the LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys +*/ + +#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_; +} diff --git a/lily/identifier.cc b/lily/identifier.cc index 59f1ff5d83..fbf806edf7 100644 --- a/lily/identifier.cc +++ b/lily/identifier.cc @@ -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 index 0000000000..cd500c1901 --- /dev/null +++ b/lily/include/dynamic-reg.hh @@ -0,0 +1,30 @@ +/* + dynamic-reg.hh -- declare Dynamic_register + + source file of the LilyPond music typesetter + + (c) 1997 Han-Wen Nienhuys +*/ + + +#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 diff --git a/lily/include/identifier.hh b/lily/include/identifier.hh index 1aa7f7d0c4..aa8d110012 100644 --- a/lily/include/identifier.hh +++ b/lily/include/identifier.hh @@ -7,6 +7,7 @@ #ifndef IDENTIFIER_HH #define IDENTIFIER_HH + #include "identparent.hh" #include "symtable.hh" #include "input-staff.hh" @@ -14,11 +15,12 @@ #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 diff --git a/lily/include/identparent.hh b/lily/include/identparent.hh index 3e6d566ee7..8071dcd4f5 100644 --- a/lily/include/identparent.hh +++ b/lily/include/identparent.hh @@ -14,11 +14,13 @@ #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: diff --git a/lily/include/lookup.hh b/lily/include/lookup.hh index 524cdf1958..e850586626 100644 --- a/lily/include/lookup.hh +++ b/lily/include/lookup.hh @@ -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); - 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)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(); diff --git a/lily/include/musicalrequest.hh b/lily/include/musicalrequest.hh index 240b72afd9..208e3dc295 100644 --- a/lily/include/musicalrequest.hh +++ b/lily/include/musicalrequest.hh @@ -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 diff --git a/lily/include/paper-def.hh b/lily/include/paper-def.hh index ae557258b0..fba93580cb 100644 --- a/lily/include/paper-def.hh +++ b/lily/include/paper-def.hh @@ -21,10 +21,10 @@ 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); }; diff --git a/lily/include/score-walker.hh b/lily/include/score-walker.hh index b3d304256e..5c766150ac 100644 --- a/lily/include/score-walker.hh +++ b/lily/include/score-walker.hh @@ -26,6 +26,7 @@ class Score_walker : public PCursor int disallow_break_count_; void reinit(); public: + bool break_allowed_b(); void allow_break(Staff_walker*w); Score_walker(Score*); ~Score_walker(); diff --git a/lily/include/staff-column.hh b/lily/include/staff-column.hh index dd6303ea8c..2aa4b8166b 100644 --- a/lily/include/staff-column.hh +++ b/lily/include/staff-column.hh @@ -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_pq ); void OK() const; ~Staff_column(); void typeset_breakable_items(Array &pre_p_arr, Array &nobreak_p_arr, Array &post_p_arr); void typeset_musical_item(Item *i); + void setup_one_request(Request*); protected: - void setup_one_request(Request*); }; diff --git a/lily/include/staff-elem-info.hh b/lily/include/staff-elem-info.hh index 9c6264a86b..c07f242e31 100644 --- a/lily/include/staff-elem-info.hh +++ b/lily/include/staff-elem-info.hh @@ -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 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_; }; diff --git a/lily/include/symtable.hh b/lily/include/symtable.hh index f96d02c1ec..5f902c4913 100644 --- a/lily/include/symtable.hh +++ b/lily/include/symtable.hh @@ -8,6 +8,8 @@ #include "symbol.hh" struct Symtable : public Assoc { + String id_str; + Symbol lookup(String)const; void print()const; }; @@ -19,7 +21,7 @@ struct Symtables : private Assoc { ~Symtables(); Symtables(); Symtables(Symtables const&); - Assoc::add; + void add(String, Symtable*); void print()const; }; diff --git a/lily/include/text-def.hh b/lily/include/text-def.hh index cc9c3c95b3..b59df7f532 100644 --- a/lily/include/text-def.hh +++ b/lily/include/text-def.hh @@ -17,7 +17,7 @@ struct Text_def { char const* defined_ch_c_l_; - /* ****************/ + /* *************** */ virtual ~Text_def() {}; bool compare(const Text_def&); Text_def(); diff --git a/lily/include/text-item.hh b/lily/include/text-item.hh index ae0b556308..d5ff7405e1 100644 --- a/lily/include/text-item.hh +++ b/lily/include/text-item.hh @@ -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); }; diff --git a/lily/key-item.cc b/lily/key-item.cc index 963b1bc578..089eab126f 100644 --- a/lily/key-item.cc +++ b/lily/key-item.cc @@ -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); diff --git a/lily/lexer.l b/lily/lexer.l index 6f5945a605..10c5ee6b03 100644 --- a/lily/lexer.l +++ b/lily/lexer.l @@ -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; diff --git a/lily/local-key-item.cc b/lily/local-key-item.cc index 425982120c..a0152c9f3c 100644 --- a/lily/local-key-item.cc +++ b/lily/local-key-item.cc @@ -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)); diff --git a/lily/lookup.cc b/lily/lookup.cc index ffd668e75d..ede8af0855 100644 --- a/lily/lookup.cc +++ b/lily/lookup.cc @@ -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 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 a) +Lookup::meter(Array a) const { Symbol s; s.dim.x = Interval( 0 PT, 10 PT); @@ -200,7 +206,7 @@ Lookup::meter(Array a) Symbol -Lookup::stem(Real y1,Real y2) +Lookup::stem(Real y1,Real y2) const { if (y1 > y2) { Real t = y1; diff --git a/lily/lyric-item.cc b/lily/lyric-item.cc index c0adac7b63..cb8c7547e4 100644 --- a/lily/lyric-item.cc +++ b/lily/lyric-item.cc @@ -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_ ); } diff --git a/lily/meter.cc b/lily/meter.cc index 94f6b6c5e9..c16d5d3d3f 100644 --- a/lily/meter.cc +++ b/lily/meter.cc @@ -12,7 +12,7 @@ Meter::Meter(Arraya) 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)); } diff --git a/lily/mylexer.cc b/lily/mylexer.cc index 7da6dddec8..9c9179c856 100644 --- a/lily/mylexer.cc +++ b/lily/mylexer.cc @@ -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, diff --git a/lily/notehead.cc b/lily/notehead.cc index 722b231e68..4d0157abe9 100644 --- a/lily/notehead.cc +++ b/lily/notehead.cc @@ -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) diff --git a/lily/paper-def.cc b/lily/paper-def.cc index b49a53fc8e..6063347e88 100644 --- a/lily/paper-def.cc +++ b/lily/paper-def.cc @@ -89,3 +89,8 @@ Paper_def::print() const mtor << "}\n"; #endif } +const Lookup* +Paper_def::lookup_l() +{ + return lookup_p_; +} diff --git a/lily/parser.y b/lily/parser.y index ba9703e4b8..ebec63fbef 100644 --- a/lily/parser.y +++ b/lily/parser.y @@ -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 IDENTIFIER +%token IDENTIFIER REAL_IDENTIFIER REQUEST_IDENTIFIER %token PITCHMOD DURATION RESTNAME %token NOTENAME %token REAL @@ -98,7 +98,7 @@ int fatal_error_i = 0; %type staff_block staff_init staff_body %type int %type intastint_list -%type post_request pre_request command_req +%type post_request pre_request command_req %type pitchmod %type music %type music_chord music_chord_body @@ -113,7 +113,7 @@ int fatal_error_i = 0; %type notename_tab notename_tab_body %type script_dir %type