diff options
author | Han-Wen Nienhuys <hanwen@xs4all.nl> | 1996-11-19 00:38:26 +0100 |
---|---|---|
committer | Han-Wen Nienhuys <hanwen@xs4all.nl> | 1996-11-19 00:38:26 +0100 |
commit | c3fe80ddeb9acfcf5d569fcef1caaef6ef7a01fb (patch) | |
tree | f27a9b64028dc1eeef276822d691e064eb296339 | |
parent | f3b8153dec5313fd5d539fc5aca9c7699de152ee (diff) |
release: 0.0.7
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | README | 2 | ||||
-rw-r--r-- | Sources.make | 10 | ||||
-rw-r--r-- | TODO | 15 | ||||
-rw-r--r-- | debug.cc | 15 | ||||
-rw-r--r-- | flower/Makefile | 2 | ||||
-rw-r--r-- | flower/Sources.make | 2 | ||||
-rw-r--r-- | flower/TODO | 4 | ||||
-rw-r--r-- | flower/compare.hh | 20 | ||||
-rw-r--r-- | flower/cursor.hh | 13 | ||||
-rw-r--r-- | flower/cursor.inl | 10 | ||||
-rw-r--r-- | flower/list.cc | 87 | ||||
-rw-r--r-- | flower/list.hh | 2 | ||||
-rw-r--r-- | flower/list.inl | 93 | ||||
-rw-r--r-- | flower/pcursor.hh | 38 | ||||
-rw-r--r-- | flower/plist.cc | 10 | ||||
-rw-r--r-- | flower/plist.hh | 34 | ||||
-rw-r--r-- | flower/plist.inl | 29 | ||||
-rw-r--r-- | flower/vray.hh | 2 | ||||
-rw-r--r-- | item.cc | 30 | ||||
-rw-r--r-- | item.hh | 32 | ||||
-rw-r--r-- | lexer.l | 2 | ||||
-rw-r--r-- | lilyponddefs.tex | 50 | ||||
-rw-r--r-- | line.cc | 101 | ||||
-rw-r--r-- | line.hh | 7 | ||||
-rw-r--r-- | lookupsyms.cc | 33 | ||||
-rw-r--r-- | lookupsyms.hh | 2 | ||||
-rw-r--r-- | maartje.ly | 5 | ||||
-rw-r--r-- | main.cc | 2 | ||||
-rwxr-xr-x | make_patch | 23 | ||||
-rw-r--r-- | melodicstaff.cc | 32 | ||||
-rw-r--r-- | melodicstaff.hh | 3 | ||||
-rw-r--r-- | molecule.cc | 11 | ||||
-rw-r--r-- | note.cc | 7 | ||||
-rw-r--r-- | paper.cc | 6 | ||||
-rw-r--r-- | paper.hh | 1 | ||||
-rw-r--r-- | parser.y | 2 | ||||
-rw-r--r-- | request.cc | 9 | ||||
-rw-r--r-- | request.hh | 26 | ||||
-rw-r--r-- | rhythmstaff.cc | 24 | ||||
-rw-r--r-- | rhythmstaff.hh | 1 | ||||
-rw-r--r-- | scores.cc | 2 | ||||
-rw-r--r-- | simpleprint.cc | 17 | ||||
-rw-r--r-- | simplestaff.cc | 15 | ||||
-rw-r--r-- | simplestaff.hh | 8 | ||||
-rw-r--r-- | spanner.cc | 32 | ||||
-rw-r--r-- | spanner.hh | 33 | ||||
-rw-r--r-- | stem.cc | 90 | ||||
-rw-r--r-- | stem.hh | 31 | ||||
-rw-r--r-- | symbol.ini | 20 | ||||
-rw-r--r-- | symtable.cc | 4 | ||||
-rw-r--r-- | template1.cc | 3 | ||||
-rw-r--r-- | template2.cc | 1 | ||||
-rw-r--r-- | voice.cc | 56 | ||||
-rw-r--r-- | voice.hh | 3 |
55 files changed, 707 insertions, 407 deletions
@@ -1,6 +1,6 @@ MAJVER=0 MINVER=0 -PATCHLEVEL=6 +PATCHLEVEL=7 # # @@ -19,6 +19,8 @@ You will need GNU C++ v2.7 or better and GNU make. If you actually want to use this, you'd better use the "speedy" compilation flags in the Makefile. +why G++ >= 2.7? LilyPond & flower lib uses builtin bool and typeof. + USING No, you shouldn't. Really. If you're still not discouraged; this is diff --git a/Sources.make b/Sources.make index deb1a524c4..fcc62df96c 100644 --- a/Sources.make +++ b/Sources.make @@ -10,7 +10,7 @@ hdr= qlp.hh linespace.hh qlpsolve.hh\ misc.hh score.hh notename.hh lexer.hh symtable.hh\ symbol.hh main.hh dimen.hh paper.hh lookupsyms.hh\ sccol.hh stcol.hh scommands.hh melodicstaff.hh\ - identifier.hh simplestaff.hh + identifier.hh simplestaff.hh spanner.hh stem.hh mycc= qlp.cc qlpsolve.cc \ break.cc linespace.cc molecule.cc line.cc\ @@ -19,9 +19,11 @@ mycc= qlp.cc qlpsolve.cc \ symbol.cc request.cc notename.cc voice.cc\ keyword.cc linestaff.cc table.cc command.cc\ warn.cc debug.cc symtable.cc boxes.cc\ - pstaff.cc tstream.cc version.cc\ + pstaff.cc tstream.cc\ calcideal.cc scores.cc identifier.cc \ dimen.cc paper.cc lookupsyms.cc scommands.cc\ sccol.cc stcol.cc getcommands.cc simplestaff.cc\ - melodicstaff.cc simpleprint.cc\ - template1.cc template2.cc template3.cc + melodicstaff.cc simpleprint.cc stem.cc\ + spanner.cc\ + template1.cc template2.cc template3.cc\ + version.cc
\ No newline at end of file @@ -1,6 +1,13 @@ -fonttables -> fontdims -clear IDENTIFIERs -Paperdef -> fontsize . -beam + stem + * clefs + * beam + * fonttables -> fontdims + + * clear IDENTIFIERs + + * Paperdef -> fontsize . + + * merge Paper, Lookup, Outputfile, and Symtable. + + * all places in the code marked TODO! and ugh/ARGH @@ -1,12 +1,27 @@ #include <fstream.h> +#include <std/new.h> #include "debug.hh" #include "dstream.hh" #include "vector.hh" Dstream monitor(&cout,".dstreamrc"); ostream * nulldev = new ofstream("/dev/null"); + + +/* + want to do a stacktrace . + */ +void +mynewhandler() +{ + cerr << "Out of free store memory. Aborting.. "<< flush; + assert(false); +} + + void debug_init() { + set_new_handler(&mynewhandler); set_matrix_debug(monitor); } diff --git a/flower/Makefile b/flower/Makefile index 3e9a70ce15..e17cbdb0d8 100644 --- a/flower/Makefile +++ b/flower/Makefile @@ -1,6 +1,6 @@ MAJVER=1 MINVER=0 -PATCHLEVEL=6 +PATCHLEVEL=7 PACKAGENAME=flower VERSION=$(MAJVER).$(MINVER).$(PATCHLEVEL) diff --git a/flower/Sources.make b/flower/Sources.make index e8b2250ad1..8016e67323 100644 --- a/flower/Sources.make +++ b/flower/Sources.make @@ -4,7 +4,7 @@ cc=lgetopt.cc string.cc dataf.cc textdb.cc unionfind.cc \ matdebug.cc templatecc=cursor.cc list.cc tsmat.cc plist.cc -inl=findcurs.inl link.inl list.inl plist.inl cursor.inl +inl=findcurs.inl link.inl list.inl cursor.inl plist.inl hh=cursor.hh pcursor.hh lgetopt.hh link.hh list.hh dstream.hh \ string.hh stringutil.hh vray.hh textdb.hh textstr.hh assoc.hh\ findcurs.hh unionfind.hh compare.hh handle.hh matrix.hh\ diff --git a/flower/TODO b/flower/TODO index f7070ecd07..4d0774ff7c 100644 --- a/flower/TODO +++ b/flower/TODO @@ -1,7 +1,7 @@ - * PointerList<T>:List<T> -> PointerList<T>:List<T*> - * PCursor -> Pointer_cursor / PointerCursor ? + * remove List::List(element) + * efficient copy cons for List * change String::pos diff --git a/flower/compare.hh b/flower/compare.hh index 47c7101c87..9f9d4e5906 100644 --- a/flower/compare.hh +++ b/flower/compare.hh @@ -1,13 +1,23 @@ +/* + flowerlib + + (c) 1996 Han-Wen Nienhuys + */ #ifndef COMPARE_HH #define COMPARE_HH + +#define one_operator(type, function, op) \ +inline bool operator op (type t1, type t2) { return function(t1, t2) op 0; } + /// handy notations for a signed comparison #define template_instantiate_compare(type, function, prefix) \ -prefix inline bool operator>(type t1, type t2) { return function(t1, t2) > 0; } \ -prefix inline bool operator>=(type t1, type t2) { return function(t1, t2) >= 0; } \ -prefix inline bool operator==(type t1, type t2) { return function(t1, t2) == 0; } \ -prefix inline bool operator<=(type t1, type t2) { return function(t1, t2) <= 0; } \ -prefix inline bool operator<(type t1, type t2) { return function(t1, t2) < 0; } \ +prefix one_operator(type, function, >)\ +prefix one_operator(type, function, >=)\ +prefix one_operator(type, function, ==)\ +prefix one_operator(type, function, !=)\ +prefix one_operator(type, function, <)\ +prefix one_operator(type, function, <=)\ prefix inline type MAX(type t1, type t2) { return (t1 > t2 )? t1 : t2; }\ prefix inline type MIN(type t1, type t2) { return (t1 < t2 )? t1 : t2; }\ \ diff --git a/flower/cursor.hh b/flower/cursor.hh index 1c61b1a76c..4babf96545 100644 --- a/flower/cursor.hh +++ b/flower/cursor.hh @@ -16,10 +16,11 @@ class Cursor tired of the warning messages. */ Cursor( const Cursor<T>& cursor ); - + + T& thing(); /// return current T - T& operator *(); - operator T() { return *(*this); } + T& operator *() { return thing(); } + operator T() { return thing(); } Cursor<T> operator =( const Cursor<T>& c ); /// make cursor with #no# items back @@ -98,10 +99,6 @@ private: */ - - - - /* comparisons. */ @@ -119,4 +116,4 @@ template_instantiate_compare(Cursor<T>, cursor_compare, template<class T>); #include "list.hh" #include "cursor.inl" -#endif // __CURSOR_HH // +#endif // CURSOR_HH diff --git a/flower/cursor.inl b/flower/cursor.inl index bdc242590f..0b077bd811 100644 --- a/flower/cursor.inl +++ b/flower/cursor.inl @@ -25,7 +25,7 @@ Cursor<T>::Cursor( const Cursor<T>& cursor ) : template<class T> inline T& -Cursor<T>::operator *() +Cursor<T>::thing() { assert( pointer_ ); return pointer_->thing(); @@ -42,16 +42,16 @@ Cursor<T>::operator =( const Cursor<T>& c ) template<class T> inline void -Cursor<T>::add( const T& thing ) +Cursor<T>::add( const T& th ) { - list_.add( thing, *this ); + list_.add( th, *this ); } template<class T> inline void -Cursor<T>::insert( const T& thing ) +Cursor<T>::insert( const T& th ) { - list_.insert( thing, *this ); + list_.insert( th, *this ); } template<class T> diff --git a/flower/list.cc b/flower/list.cc index 741e4ee97c..ce5e366cc8 100644 --- a/flower/list.cc +++ b/flower/list.cc @@ -34,51 +34,64 @@ List<T>::OK() const assert(!lp); } + template<class T> -Cursor<T> -List<T>::top() +inline +List<T>::~List() { -#if 0 - // ?? waarvoor is deze if ? - if ( top_ ) // equivalent: if ( size_ ) - { - Link<T>* t = top_->previous(); - assert( t != top_ ); // silly link - while ( t ) - { - assert(false); // this is even more silly. - top_ = t; - t = top_->previous(); - } - } -#endif - -// list empty: Cursor not ok() - return Cursor<T>( *this, top_ ); + Cursor<T> next(*this); + for ( Cursor<T> c( *this ); c.ok(); c = next ) { + next = c; + next++; + remove( c ); + } } - template<class T> -Cursor<T> -List<T>::bottom() +inline void +List<T>::add( const T& thing, Cursor<T> after_me ) { - /* wat is dit voor zooi? kan dit niet weg? + if (!size_) { // not much choice if list is empty + bottom_ = top_ = new Link<T>( thing ); + } else { // add at aprioprate place + Link<T> *p = ( after_me.ok() ) ? + after_me.pointer() : bottom().pointer(); + p->add(thing); + if (p == bottom_) // adjust bottom_ if necessary. + bottom_ = p->next(); + } - (invarianten!) - */ - if ( bottom_ ) // equivalent: if ( size_ ) - { - Link<T>* b = bottom_->next(); - assert( b != bottom_ ); // silly link - while ( b ) - { - bottom_ = b; - b = bottom_->next(); - } - } - // list empty: Cursor not ok() - return Cursor<T>( *this, bottom_ ); + size_++; } +/** + + Procedure: + \begin{itemize} + \item if #after_me# is #ok()#, add after #after_me#, else + \item if list !empty simply add to bottom, else + \item list is empty: create first \Ref{Link} and initialize + #bottom_# and #top_#. + \end{itemize} +*/ +template<class T> +inline void +List<T>::insert( const T& thing, Cursor<T> before_me ) +{ + if (!size_) { + bottom_ = top_ = new Link<T>( thing ); + } else { + Link<T> *p = + (before_me.ok())? + before_me.pointer() : top().pointer(); + + p->insert(thing); + if (p == top_) + top_ = p->previous(); + } + + size_++; + +} #endif diff --git a/flower/list.hh b/flower/list.hh index 5a825fa89e..1516e16642 100644 --- a/flower/list.hh +++ b/flower/list.hh @@ -62,7 +62,7 @@ class List items are always stored as copies in List, but: #List<String># : copies of #String# stored #List<String*># : copies of #String*# stored! - (do not use, use \Ref{PointerList}#<String*># instead.) + (do not use, use \Ref{PointerList} #<String*># instead.) {\bf note:} retrieving "invalid" cursors, i.e. diff --git a/flower/list.inl b/flower/list.inl index 8bdcf15877..d71e947050 100644 --- a/flower/list.inl +++ b/flower/list.inl @@ -1,6 +1,8 @@ // -*-c++-*- + #ifndef LIST_INL #define LIST_INL + template<class T> inline List<T>::List() @@ -23,83 +25,6 @@ List<T>::List( const T& thing ) set_empty(); add( thing, Cursor<T>( *this, bottom_ ) ); } - -template<class T> -inline -List<T>::~List() -{ - Cursor<T> next(*this); - for ( Cursor<T> c( *this ); c.ok(); c = next ) { - next = c; - next++; - remove( c ); - } -} - -template<class T> -inline void -List<T>::add( const T& thing, Cursor<T> after_me ) -{ -#if 0 - if ( after_me.ok() ) - after_me.pointer()->add( thing ); - else if ( size_ ) - bottom().pointer()->add( thing ); - else - bottom_ = top_ = new Link<T>( thing ); -#endif - - if (!size_) { // not much choice if list is empty - bottom_ = top_ = new Link<T>( thing ); - } else { // add at aprioprate place - Link<T> *p = ( after_me.ok() ) ? - after_me.pointer() : bottom().pointer(); - p->add(thing); - if (p == bottom_) // adjust bottom_ if necessary. - bottom_ = p->next(); - } - - size_++; -} -/** - - Procedure: - \begin{itemize} - \item if #after_me# is #ok()#, add after #after_me#, else - \item if list !empty simply add to bottom, else - \item list is empty: create first \Ref{Link} and initialize - #bottom_# and #top_#. - \end{itemize} -*/ - -template<class T> -inline void -List<T>::insert( const T& thing, Cursor<T> before_me ) -{ - if (!size_) { - bottom_ = top_ = new Link<T>( thing ); - } else { - Link<T> *p = - (before_me.ok())? - before_me.pointer() : top().pointer(); - - p->insert(thing); - if (p == top_) - top_ = p->previous(); - } - - size_++; -#if 0 // rewrite hwn 16/9 - if ( before_me.ok() ) - before_me.pointer()->insert( thing ); - else if ( size_ ) - top().pointer()->insert( thing ); - else - bottom_ = top_ = new Link<T>( thing ); - size_++; -#endif -} - template<class T> inline void List<T>::remove( Cursor<T> me ) @@ -119,6 +44,20 @@ List<T>::size() const return size_; } +template<class T> +inline Cursor<T> +List<T>::top() +{ + return Cursor<T>( *this, top_ ); +} + + +template<class T> +inline Cursor<T> +List<T>::bottom() +{ + return Cursor<T>( *this, bottom_ ); +} #endif diff --git a/flower/pcursor.hh b/flower/pcursor.hh index 095bcc45bf..6cc3433e25 100644 --- a/flower/pcursor.hh +++ b/flower/pcursor.hh @@ -9,28 +9,46 @@ #define PCURSOR_HH -/// cursor which feels like a pointer +/// cursor to go with PointerList template<class T> -struct PCursor : public Cursor<T> { +struct PCursor : public Cursor<void *> { /// make cursor with #no# items back PCursor<T> operator -( int no) const { - return PCursor<T> (Cursor<T>::operator-(no)); + return PCursor<T> (Cursor<void*>::operator-(no)); } /// make cursor with #no# items further PCursor<T> operator +( int no) const { - return PCursor<T> (Cursor<T>::operator+(no)); + return PCursor<T> (Cursor<void*>::operator+(no)); } - PCursor(const List<T> & l) : Cursor<T> (l) {} + PCursor(const PointerList<T> & l) : Cursor<void*> (l) {} - PCursor( const Cursor<T>& cursor ) : Cursor<T>(cursor) { } - T operator ->() const { return *(*(Cursor<T> *)this); } + PCursor( const Cursor<void*>& cursor ) : Cursor<void*>(cursor) { } + void* vptr() const { return * ((Cursor<void*> &) *this); } + // should return T& ? + T ptr() const { return (T) vptr(); } + T operator ->() const { return ptr(); } + operator T() { return ptr(); } + T operator *() { return ptr(); } + +private: +// Cursor<void*>::operator void*; + // sigh }; /** - I like operator->(), so here it is. - - Cursor to go with pointer list. +don't create PointerList<void*>'s */ + + +template<class T> +inline int pcursor_compare(PCursor<T> a,PCursor<T>b) +{ + return cursor_compare(Cursor<void*>(b),Cursor<void*> (a)); +} + +#include "compare.hh" +template_instantiate_compare(PCursor<T>, pcursor_compare, template<class T>); + #endif diff --git a/flower/plist.cc b/flower/plist.cc index bbb0e7428f..5c8e47093c 100644 --- a/flower/plist.cc +++ b/flower/plist.cc @@ -3,14 +3,10 @@ // not inlined since it assumes knowledge of destructor. template<class T> void -PointerList<T>::remove( Cursor<T> me ) +IPointerList<T>::remove(PCursor<T> me ) { if ( me.ok() ) { - delete *me; - List<T>::remove( me ); + delete me.ptr(); + List<void*>::remove(me); } } - - - - diff --git a/flower/plist.hh b/flower/plist.hh index 8fa126b527..1bfc2d4ab4 100644 --- a/flower/plist.hh +++ b/flower/plist.hh @@ -11,21 +11,25 @@ /// Use for list of pointers, e.g. PointerList<AbstractType*>. template<class T> -class PointerList : public List<T> +class PointerList : public List<void *> { public: - PointerList(PointerList&) { set_empty(); } - PointerList( const T& thing ) : List<T>( thing ) { } + PCursor<T> top() { return PCursor<T> (List<void*>::top()); } + PCursor<T> bottom() { return PCursor<T> (List<void*>::bottom()); } + + PointerList( const T& thing ) : List<void*>( thing ) { } PointerList() {} - /// - virtual ~PointerList(); - /** - This function deletes deletes the allocated pointers of all links. - #\Ref{~List}# is used to delete the links themselves. - */ - - protected: - virtual void remove( Cursor<T> me ); +}; + + +/// intrusive pl. deletes pointers given to it. +template<class T> +struct IPointerList : public PointerList<T> { + IPointerList(IPointerList&) { set_empty(); } + IPointerList() { } +protected: + virtual void remove( Cursor<void*> me ) { remove (PCursor<T>(me)); } + virtual void remove( PCursor<T> me ); }; /** NOTE: @@ -37,16 +41,18 @@ class PointerList : public List<T> You have to copy this yourself, or use the macro PointerList__copy */ -#define PointerList__copy(T, to, from, op) \ +#define IPointerList__copy(T, to, from, op) \ for (PCursor<T> _pc_(from); _pc_.ok(); _pc_++)\ to.bottom().add(_pc_->op)\ \ template<class T> -void PL_copy(PointerList<T*> &dst,PointerList<T*> const&src); +void PL_copy(IPointerList<T*> &dst,IPointerList<T*> const&src); + #define PL_instantiate(a) L_instantiate(a *); template class PointerList<a*> +#define IPL_instantiate(a) PL_instantiate(a); template class IPointerList<a*> #include "plist.inl" diff --git a/flower/plist.inl b/flower/plist.inl index b8cd8d6020..82be364334 100644 --- a/flower/plist.inl +++ b/flower/plist.inl @@ -7,36 +7,15 @@ #ifndef PLIST_INL #define PLIST_INL - - -template<class T> -inline -PointerList<T>::~PointerList() -{ - Cursor<T> next(*this); - for ( Cursor<T> c( *this ); c.ok(); c = next ) { - next = c; - next++; - remove( c ); // PointerList::remove deletes the real data - } -} - -template<class T> -inline void -PointerList_print( PointerList<T> const & l ) -{ - for (PCursor<T> c(l ); c.ok(); c++ ) - c->print(); -} - template<class T> -inline void -PL_copy(PointerList<T*> &to,PointerList<T*> const&src) +void +PL_copy(IPointerList<T*> &to, IPointerList<T*> const&src) { for (PCursor<T*> pc(src); pc.ok(); pc++) { T *q = pc; - T *p=new T(*q) ; // argh, how do i do this in ANSI-C++ + T *p=new T(*q) ; to.bottom().add(p); } } + #endif diff --git a/flower/vray.hh b/flower/vray.hh index c03e651034..ab6255109b 100644 --- a/flower/vray.hh +++ b/flower/vray.hh @@ -128,7 +128,7 @@ public: int lower = -1, int upper = -1 ) { if (lower < 0) { lower = 0 ; - upper = sz(); + upper = sz()-1; } if (lower >= upper) return; @@ -4,31 +4,6 @@ #include "pcol.hh" String -Spanner::TeXstring() const -{ - assert(right->line); - Real w = left->hpos - right->hpos; - return strets->eval(w).tex; -} - -Spanner * -Spanner::broken_at(const PCol *c1, const PCol *c2) const -{ - Spanner *sp = new Spanner(*this); - sp->left = c1; - sp->right = c2; - return sp; -} - -Spanner::Spanner() -{ - pstaff_=0; - strets=0; - left = right = 0; -} - -/****************************************************************/ -String Item::TeXstring() const { return output->TeXstring(); @@ -46,7 +21,10 @@ Item::height() const return output->extent().y; } -/****************************************************************/ +Item::~Item() +{ + delete output; +} Item::Item() { @@ -6,43 +6,27 @@ #include "string.hh" #include "tex.hh" -/// a symbol which is attached between two columns. -struct Spanner { - const PCol *left, *right; - Parametric_symbol *strets; - PStaff * pstaff_; - /// clone a piece of this spanner. - Spanner *broken_at(const PCol *c1, const PCol *c2) const; - /** - - PRE - c1 >= start, c2 <= stop - */ - String TeXstring () const ; - Spanner(); -}; -/** Spanner should know about the items which it should consider: - e.g. slurs should be steep enough to "enclose" all those items. This - is absolutely necessary for beams, since they have to adjust the - length of stems of notes they encompass. - - */ -/// a fixed size element of the score +/// a horizontally fixed size element of the score struct Item { - virtual Interval width() const; - virtual Interval height() const; const PCol * col; Molecule *output; PStaff *pstaff_; /** needed for knowing at which staff to output this item */ + + /****************/ + + virtual Interval width() const; + virtual Interval height() const; String TeXstring () const ; Item(); void print()const; + virtual ~Item(); }; /** An item must be part of a Column */ + #endif @@ -36,7 +36,7 @@ PITCH ['`]*{OPTSIGN}{NOTENAME} DURNAME 1|2|4|8|16|32 DURATION {DURNAME}\.* FULLNOTE {PITCH}{DURATION}? -WORD [a-zA-Z]+ +WORD [a-zA-Z][a-zA-Z0-9_]+ REAL [0-9]+(\.[0-9]*)? %% diff --git a/lilyponddefs.tex b/lilyponddefs.tex index 24dd617150..45152140cb 100644 --- a/lilyponddefs.tex +++ b/lilyponddefs.tex @@ -12,20 +12,20 @@ \def\musixtwentydefs{ \font\musicfnt=musix20 - \interlinedist=5pt \balkhoog=20pt \staffrulethickness=0.4pt +} + +\def\musixcalc{ \interstaffrule=\balkhoog \advance\interstaffrule by-\staffrulethickness \divide\interstaffrule by 4 - \advance\interstaffrule by -\staffrulethickness + \advance\interstaffrule by -\staffrulethickness } -\def\interstaffline{ - \vskip 20pt% -} \musixtwentydefs +\musixcalc \mdef\quartball{'007} \mdef\halfball{'010} @@ -43,32 +43,52 @@ \mdef\doubledot{'01} \mdef\tripledot{'02} \mdef\mussepline{155} +\mdef\ieigthflag{45} +\mdef\isixteenthflag{46} +\mdef\ithirtysecondflag{47} +\mdef\ueigthflag{40} +\mdef\usixteenthflag{41} +\mdef\uthirtysecondflag{42} \def\maatstreep{\vrule height\balkhoog} \def\finishbar{\vrule height\balkhoog width 1pt} \def\generalmeter#1#2{\vbox to 0pt{\vss\rm\hbox{#1}\hbox{#2}}} - \def\lineseparator{\vbox{\mussepline\vskip -5pt\mussepline}} -\def\interscoreline{ + +\def\beauty{ \par\vskip 10pt\par \hskip -5pt\lineseparator% \hbox to 1cm{\kern -5mm\hrulefill} \vskip 10pt } +\def\interstaffline{% + \vskip 10pt +% \nointerlineskip +% \vbox{\hbox to 0pt{\vrule width20pt height1pt\hss}} +} +\def\ugly{\nointerlineskip\par +\vskip 40pt\par\vbox{\hbox to 0pt{\vrule width30pt height1pt\hss}}\par\vskip 40pt +} +\def\interscoreline{\beauty} % % a staffsymbol with #1 lines, width #2 % bottom at baseline -\def\linestafsym#1#2{\hbox to 0pt% +\def\linestafsym#1#2{\vbox to 0pt{\hbox to 0pt% {\vbox to 0pt{\vss% - \vskip-\interlinedist - \n=0% + \kern-\interstaffrule + \n=0\nointerlineskip% \loop\ifnum\n<#1\advance\n by1% - \vskip\interstaffrule \hrule height \staffrulethickness width#2 + \kern\interstaffrule \hrule height \staffrulethickness width#2 \repeat }% -\hss}} +\hss}}} \def\vcenter#1{\vbox to 0pt{\vss #1\vss}} +\def\topalign#1{\vbox to 0pt{#1\vss}} + +\def\eigthflag{\topalign{\ueigthflag}} +\def\sixteenthflag{\topalign{\usixteenthflag}} +\def\thirtysecondflag{\topalign{\uthirtysecondflag}} \def\cquartrest{\vcenter\quartrest} \def\ceighthrest{\vcenter\eighthrest} @@ -79,4 +99,10 @@ \def\ldoubledot{\kern-6pt\doubledot} \def\ltripledot{\kern-6pt\tripledot} +\def\stem#1#2{\vrule height#2 depth-#1} + +\def\placebox#1#2#3{% + \vbox to 0pt{\vss\hbox{\raise #1\hbox to 0pt{\kern #2{}#3\hss}}}% +} + @@ -1,19 +1,27 @@ #include "line.hh" #include "dimen.hh" +#include "spanner.hh" #include "symbol.hh" #include "paper.hh" #include "pcol.hh" #include "pscore.hh" +static String +make_vbox(Interval i) +{ + + String s("\\vbox to "); + s += print_dimen(i.length()); + s += "{\\vskip "+print_dimen(i.max)+" "; + return s; +} + + String Line_of_staff::TeXstring() const { - String s("%line_of_staff\n\\vbox to "); - s += print_dimen(maxheight() ) +"{"; - - //make some room - s += vstrut(base); - + String s("%line_of_staff\n"); + s+=make_vbox(height()); // the staff itself: eg lines, accolades s += "\\hbox{"; { @@ -28,7 +36,8 @@ Line_of_staff::TeXstring() const lastpos = cc->hpos; // moveover - s +=String( "\\kern ") + print_dimen(delta); + if (delta) + s +=String( "\\kern ") + print_dimen(delta); // now output the items. @@ -46,44 +55,8 @@ Line_of_staff::TeXstring() const return s; } -String -Line_of_score::TeXstring() const -{ - String s("\\vbox{"); - for (PCursor<Line_of_staff*> sc(staffs); sc.ok(); sc++){ - s += sc->TeXstring(); - if ((sc+1).ok()) - s+= "\\interstaffline\n"; - } - s += "}"; - return s; -} - -/// testing this entry -Line_of_score::Line_of_score(svec<const PCol *> sv, - const PScore *ps) -{ - score = ps; - for (int i=0; i< sv.sz(); i++) { - PCol *p=(PCol *) sv[i]; - cols.bottom().add(p); - p->line=this; - } - - for (PCursor<PStaff*> sc(score->staffs); sc.ok(); sc++) - staffs.bottom().add(new Line_of_staff(this, sc)); -} -/** construct a line with the named columns. Make the line field - in each column point to this - - #sv# isn't really const!! - */ - Line_of_staff::Line_of_staff(Line_of_score * sc, PStaff*st) { - // [don't know how to calc dimensions yet.] - height = 0.0; - base =0.0; scor=sc; pstaff_=st; @@ -101,8 +74,8 @@ Line_of_staff::Line_of_staff(Line_of_score * sc, PStaff*st) } -Real -Line_of_staff::maxheight() const +Interval +Line_of_staff::height() const { Interval y; { @@ -113,8 +86,6 @@ Line_of_staff::maxheight() const // all items in the current line & staff. for (; cc.ok(); cc++) { - - for (PCursor<const Item *> ic(cc->its); ic.ok(); ic++) { if (ic->pstaff_ == pstaff_) { y.unite(ic->height()); @@ -126,7 +97,41 @@ Line_of_staff::maxheight() const assert(false); } } - return y.max; + return y; +} + + +/****************************************************************/ +String +Line_of_score::TeXstring() const +{ + String s("\\vbox{%<- line of score\n"); + for (PCursor<Line_of_staff*> sc(staffs); sc.ok(); sc++){ + s += sc->TeXstring(); + if ((sc+1).ok()) + s+= "\\interstaffline\n"; + } + s += "}"; + return s; } +/// testing this entry +Line_of_score::Line_of_score(svec<const PCol *> sv, + const PScore *ps) +{ + score = ps; + for (int i=0; i< sv.sz(); i++) { + PCol *p=(PCol *) sv[i]; + cols.bottom().add(p); + p->line=this; + } + + for (PCursor<PStaff*> sc(score->staffs); sc.ok(); sc++) + staffs.bottom().add(new Line_of_staff(this, sc)); +} +/** construct a line with the named columns. Make the line field + in each column point to this + + #sv# isn't really const!! + */ @@ -34,11 +34,6 @@ Line_of_score { /// one broken line of staff. struct Line_of_staff { - Real height; - - /// y-pos of the baseline, measured from the top. - Real base; - PointerList<Spanner *> brokenspans; Line_of_score const * scor; const PStaff *pstaff_; @@ -47,7 +42,7 @@ struct Line_of_staff { String TeXstring() const; Line_of_staff(Line_of_score*, PStaff *); - Real maxheight()const; + Interval height() const; }; #endif diff --git a/lookupsyms.cc b/lookupsyms.cc index f0624cad1e..294f2e9af4 100644 --- a/lookupsyms.cc +++ b/lookupsyms.cc @@ -49,6 +49,12 @@ Lookup::dots(int j) return (*symtables_)("dots")->lookup(j); } +Symbol +Lookup::flag(int j) +{ + return (*symtables_)("flags")->lookup(j); +} + /****************************************************************/ // bare bones. @@ -66,7 +72,7 @@ Linestaf_symbol::eval(svec<String> w)const Symbol s; s.dim.x = Interval(0,wid); - Real dy=lines*convert_dimen(5,"pt"); + Real dy=(lines-1)*convert_dimen(5,"pt"); // TODO! s.dim.y = Interval(0,dy); svec<String> a; a.add(lines); @@ -84,7 +90,8 @@ struct Meter_sym:Parametric_symbol { Meter_sym(Symtables*s) : Parametric_symbol(s){ } Symbol eval(svec<String> a) const{ Symbol s; - s.dim.x = Interval( convert_dimen(-5,"pt"), convert_dimen(10,"pt")); + s.dim.x = Interval( convert_dimen(-5,"pt"), + convert_dimen(5,"pt")); s.dim.y = Interval(0, convert_dimen(10,"pt") ); // todo String src = (*symtables_)("param")->lookup("meter").tex; s.tex = substitute_args(src,a); @@ -93,6 +100,23 @@ struct Meter_sym:Parametric_symbol { }; /****************************************************************/ +struct Stem_sym:Parametric_symbol { + + Stem_sym(Symtables*s) : Parametric_symbol(s) { } + Symbol eval(svec<String> a) const { + Real y1 = a[0].fvalue(); + Real y2 = a[1].fvalue(); + assert(y1 <= y2); + Symbol s; + s.dim.x = Interval(0,0); + s.dim.y = Interval(y1,y2); + + String src = (*symtables_)("param")->lookup("stem").tex; + s.tex = substitute_args(src,a); + return s; + } +}; + Parametric_symbol * Lookup::meter(String ) { @@ -105,3 +129,8 @@ Lookup::linestaff(int n) return new Linestaf_symbol(n,symtables_); } +Parametric_symbol* +Lookup::stem() +{ + return new Stem_sym(symtables_); +} diff --git a/lookupsyms.hh b/lookupsyms.hh index a3c0750d0e..f7ac3858ac 100644 --- a/lookupsyms.hh +++ b/lookupsyms.hh @@ -14,7 +14,9 @@ struct Lookup { void parse (Text_db&t); Parametric_symbol *linestaff(int n); Parametric_symbol *meter(String); + Parametric_symbol *stem(); Symbol ball(int); + Symbol flag(int); Symbol rest(int); Symbol bar(String); Symbol dots(int); diff --git a/maartje.ly b/maartje.ly index 00d4ea8d5e..50ce2cb577 100644 --- a/maartje.ly +++ b/maartje.ly @@ -1,12 +1,10 @@ - - ritme = rhythmstaff { voice { $ c2 r32 r32 r16 r8 r4 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 c2 $ } } melody= melodicstaff { - voice { $ c2.. r8 r4 r8 r16 r32 r32 d8 e8 f8 g8 a8 b8 'c8 c8 r4 c4 c4 c4 c4 c4 c4 $ } + voice { $ c2.. r8 r4 r8 r16 r32 r32 d8 e8 f8 g8 ''fis1 a8 b8 'c8 c8 `c8 ``c8 c4 c4 c4 c4 $ } } score { paper { @@ -14,6 +12,7 @@ score { } staff { ritme } staff { melody } +% staff { melody } commands { meter 4 4 skip 3:0 @@ -41,7 +41,7 @@ int main (int argc, char **argv) { Getopt_long oparser(argc, argv,theopts); - + debug_init(); cout << get_version(); while (long_option_init * opt = oparser()) { diff --git a/make_patch b/make_patch index c2a1e50f8a..2e9246f4d7 100755 --- a/make_patch +++ b/make_patch @@ -2,27 +2,30 @@ old=$1 new=$2 nm=$3- + newarc=$nm$new.tar.gz oldarc=$nm$old.tar.gz -if [ ! -f $newarc ] -then - echo cant find $newarc - exit -fi -if [ ! -f $oldarc ] -then - echo cant find oldarc - exit -fi + + if [ ! -x $nm$new ] then echo untarring .. tar zfxv $nm$new.tar.gz + if [ ! -f $newarc ] + then + echo cant find $newarc + exit + fi fi if [ ! -x $nm$old ] then echo untarring tar zfxv $nm$old.tar.gz + if [ ! -f $oldarc ] + then + echo cant find oldarc + exit + fi fi #(cd $nm$old; touch depend; make clean) diff --git a/melodicstaff.cc b/melodicstaff.cc index 60d9a6fd2e..83e038652f 100644 --- a/melodicstaff.cc +++ b/melodicstaff.cc @@ -1,36 +1,60 @@ #include "melodicstaff.hh" +#include "stem.hh" + #include "paper.hh" #include "molecule.hh" #include "linestaff.hh" #include "rhythmstaff.hh" #include "sccol.hh" +const int NO_LINES=5; +const int BOTTOM_POSITION=2; // e is on bottom line of 5-staff... + void Melodic_staff::set_output(PScore*ps) { - theline = new Linestaff(5,ps); + theline = new Linestaff(NO_LINES,ps); Simple_staff::set_output(ps); } void Melodic_column::typeset_command(Command *com, int breakst) { - Item *i = create_command_item(com); + Molecule*m=create_command_mol(com); + Item *i =new Item; + i->output = m; typeset_item(i, breakst); } void Melodic_column::typeset_req(Request *rq) { - Item *i = create_req_item(rq); + Item *i =new Item; + Molecule*m=create_req_mol(rq); + if (rq->note()) { int h = rq->note()->height(); Real dy = staff_->paper()->interline()/2; - i->output->translate(Offset(0,(h-2)*dy)); + m->translate(Offset(0,(h-BOTTOM_POSITION)*dy)); } + i->output = m; typeset_item(i); } + +void +Melodic_column::typeset_stem(Stem_req*rq) +{ + Stem * s = new Stem(NO_LINES); + int n = the_note->note()->height()-BOTTOM_POSITION; + s->minnote =s->maxnote=n; + s->flag = rq->stem_number; + s->calculate(); + typeset_item(s); + + s->brew_molecole(); +} + /* creation */ diff --git a/melodicstaff.hh b/melodicstaff.hh index a91a413659..5c417b84a5 100644 --- a/melodicstaff.hh +++ b/melodicstaff.hh @@ -19,7 +19,8 @@ struct Melodic_staff : public Simple_staff struct Melodic_column : public Simple_column { virtual void typeset_req(Request *rq); - virtual void typeset_command(Command *, int brs); + virtual void typeset_stem(Stem_req *rq); + virtual void typeset_command(Command *, int brs); // virtual void typeset_item(Item*, int=1); Melodic_column(Score_column*s,Simple_staff*rs) : Simple_column(s,rs) { } diff --git a/molecule.cc b/molecule.cc index 5ab384f87d..8fca34836b 100644 --- a/molecule.cc +++ b/molecule.cc @@ -29,11 +29,12 @@ String Atom::TeXstring() const { // whugh.. Hard coded... - String s("\\raise"); - s+= print_dimen(off.y) +"\\hbox to 0pt{\\kern "; - s+= print_dimen(off.x); - s+= sym.tex + "\\hss}"; - return s; + String s("\\placebox{%}{%}{%}"); + svec<String> a; + a.add(print_dimen(off.y)); + a.add(print_dimen(off.x)); + a.add(sym.tex); + return substitute_args(s, a); } @@ -32,6 +32,7 @@ parse_duration(const char *a, int &j, int &intdur, int &dots) } + void parse_pitch( const char *a, int &j, int &oct, bool & overide_acc, int & large, int & small) @@ -94,6 +95,11 @@ get_note_element(String pitch, String durstr) Note_req * rq = new Note_req( v); + if (dur >= 2) { + Stem_req * st = new Stem_req(v, dur); + v->add(st); + } + int oct, pit, acc; bool forceacc; parse_pitch(pitch, i, oct, forceacc, pit, acc); @@ -111,6 +117,7 @@ get_note_element(String pitch, String durstr) rq->print(); v->add(rq); + return v; } @@ -38,7 +38,11 @@ Paperdef::interline() const { return lookup_->ball(4).dim.y.length(); } - +Real +Paperdef::note_width()const +{ + return lookup_->ball(4).dim.x.length( ); +} Real Paperdef::standard_height() const { @@ -15,6 +15,7 @@ struct Paperdef { ~Paperdef(); Real interline()const; Real standard_height()const; + Real note_width() const; void print() const; }; @@ -130,7 +130,7 @@ staff_block: | melodicstaff_block ; -staffdecl: STAFF '{' IDENTIFIER '}' { $$ = $3->staff(); } +staffdecl: STAFF '{' IDENTIFIER '}' { $$ = $3->staff()->clone(); } ; rhythmstaff_block: diff --git a/request.cc b/request.cc index 88fdb3349f..fd032fcfd8 100644 --- a/request.cc +++ b/request.cc @@ -1,6 +1,15 @@ #include "request.hh" #include "debug.hh" +#define VIRTUALCONS(T,R) R *T::clone() const { return new T(*this); } struct T +#define RCONS(T) VIRTUALCONS(T, Request) + +RCONS(Rest_req); +RCONS(Rhythmic_req); +RCONS(Stem_req); +RCONS(Note_req); + + void Request::print() const { diff --git a/request.hh b/request.hh index 8ebb1468c0..04664966b3 100644 --- a/request.hh +++ b/request.hh @@ -1,4 +1,4 @@ -// mpp96's second egg of columbus! +// LilyPond's second egg of columbus! #ifndef REQUEST_HH #define REQUEST_HH @@ -7,17 +7,19 @@ /// a voice element wants something printed struct Request { - Voice_element*elt; + Voice_element*elt; // indirection. /****************/ virtual void print()const ; virtual Note_req *note() {return 0;} + virtual Stem_req *stem() {return 0;} virtual Rest_req *rest() {return 0;} virtual Rhythmic_req*rhythmic() { return 0;} Request(Voice_element*); Request(); virtual Real duration() const { return 0.0; } + virtual Request* clone() const =0; }; /** @@ -45,7 +47,7 @@ struct Request { that voice. After #Staff# made up her mind (Would #Staff# be a smart - name? How about #struct Lily {}# :-), the resultant items and + name? How about #struct Susan {}# :-), the resultant items and spanners are put on the PScore, and pointers to these items are stored in the #Voice_element#. This construction enables the beams/stems to look up the balls it has to connect to. */ @@ -62,6 +64,7 @@ struct Rhythmic_req : Request { Rhythmic_req(Voice_element*); Rhythmic_req*rhythmic() { return this;} void print ()const; + Request*clone() const; }; /// Put a note of specified type, height, and with accidental on the staff. @@ -78,6 +81,7 @@ struct Note_req : Rhythmic_req { Note_req(Voice_element*v); Note_req*note() { return this;} virtual void print() const; + Request*clone() const; }; /** Staff has to decide if the ball should be hanging left or right. This @@ -95,11 +99,22 @@ struct Rest_req : Rhythmic_req { void print()const; Rest_req(Voice_element*v) : Rhythmic_req(v) { } Rest_req * rest() { return this;} + Request*clone() const ; }; /** Why a request? It might be a good idea to not typeset the rest, if the paper is too crowded. */ +/// attach a stem to the noteball +struct Stem_req : Request { + /// 4,8,16, .. + int stem_number; + virtual Stem_req *stem() {return this;} + Stem_req(Voice_element*v, int s) : Request(v) { stem_number = s; } + Request*clone() const; +}; + + #if 0 ///Put a lyric above or below (?) this staff. @@ -136,11 +151,6 @@ enum Loudness { FFF, FF, F, MF, MP, P, PP, PPP } ; -/// attach a stem to the noteball -struct Stem_req : Request { - /// 4,8,16, .. - int stem_number ; -}; /// requests to start or stop something. struct Span_req : Request { /// should the spanner start or stop, or is it unwanted? diff --git a/rhythmstaff.cc b/rhythmstaff.cc index 4e564bdf88..7e2706e02d 100644 --- a/rhythmstaff.cc +++ b/rhythmstaff.cc @@ -1,4 +1,5 @@ #include "molecule.hh" +#include "stem.hh" #include "linestaff.hh" #include "rhythmstaff.hh" #include "paper.hh" @@ -16,19 +17,34 @@ Rhythmic_staff::set_output(PScore*ps) void Rhythmic_column::typeset_command(Command *com, int breakst) { - Item *i = create_command_item(com); - i->output->translate(Offset(0, - -staff_->score_->paper_->standard_height()/2)); + Item *i =new Item; + Molecule*m = create_command_mol(com); + i->output=m; + m->translate(Offset(0, + -staff_->score_->paper_->standard_height()/2)); typeset_item(i, breakst); } void Rhythmic_column::typeset_req(Request *rq) { - Item *i =create_req_item(rq); + Item *i =new Item; + Molecule*m=create_req_mol(rq); + i->output=m; typeset_item(i); } +void +Rhythmic_column::typeset_stem(Stem_req*rq) +{ + Stem * s = new Stem(0); + s->minnote = s->maxnote = 0; + s->flag = rq->stem_number; + s->calculate(); + typeset_item(s); + s->brew_molecole(); +} + /* creation */ diff --git a/rhythmstaff.hh b/rhythmstaff.hh index 7fe7c6a887..130f6483b9 100644 --- a/rhythmstaff.hh +++ b/rhythmstaff.hh @@ -21,6 +21,7 @@ struct Rhythmic_staff : public Simple_staff /// this does the typesetting struct Rhythmic_column : public Simple_column { virtual void typeset_req(Request *rq); + virtual void typeset_stem(Stem_req *rq); virtual void typeset_command(Command *, int brs); @@ -6,6 +6,8 @@ static svec<Score*> sv; static String outfn="lelie.uit"; +// todo: check we don't overwrite default output. + void do_scores() { diff --git a/simpleprint.cc b/simpleprint.cc index 91b7761738..b8f02c5798 100644 --- a/simpleprint.cc +++ b/simpleprint.cc @@ -6,10 +6,9 @@ #include "molecule.hh" #include "sccol.hh" -Item * -Simple_column::create_req_item(Request *rq) +Molecule * +Simple_column::create_req_mol(Request *rq) { - Item *i = new Item; Symbol s; int dots=0; @@ -29,13 +28,11 @@ Simple_column::create_req_item(Request *rq) dm.add(Atom(d)); m->add_right(dm); } - i->output=m; - return i; + return m; } -Item * -Simple_column::create_command_item(Command *com) +Molecule * +Simple_column::create_command_mol(Command *com) { - Item *i = new Item; Symbol s; if (com -> args[0] == "BAR" ) { @@ -59,8 +56,8 @@ Simple_column::create_command_item(Command *com) if (!wid.empty()) m->translate(Offset(wid.max,0)); } - i->output=m; - return i; + + return m; } void diff --git a/simplestaff.cc b/simplestaff.cc index 763a9ed393..97250b48cb 100644 --- a/simplestaff.cc +++ b/simplestaff.cc @@ -12,6 +12,7 @@ Simple_column::Simple_column(Score_column*s, Simple_staff *rs) : Staff_column(s) { the_note = 0; + stem_ = 0; staff_ = rs; } @@ -20,7 +21,6 @@ Simple_staff::Simple_staff() theline = 0; } -// should integrate handling of BREAK commands into Staff_column void Simple_column::process_commands( ) { @@ -50,7 +50,7 @@ Simple_column::process_commands( ) accept: BREAK: all - TYPESET: bar, meter + TYPESET: bar, meter, */ @@ -64,12 +64,15 @@ Simple_column::process_requests() Request *rq= rqc; if (rq->rhythmic()){ if (the_note){ - WARN << "too many notes.\n"; - return; + WARN << "too many notes.\n"; } the_note = rq; + } - break; + if (rq->stem()) { + stem_ = rq->stem(); + } + } } @@ -80,6 +83,8 @@ Simple_staff::grant_requests() Simple_column *rp = (Simple_column*)*cc; if (rp->the_note) rp->typeset_req( rp->the_note); + if (rp->stem_) + rp->typeset_stem(rp->stem_->stem()); } } diff --git a/simplestaff.hh b/simplestaff.hh index e2efafe398..c965765adb 100644 --- a/simplestaff.hh +++ b/simplestaff.hh @@ -19,16 +19,18 @@ struct Simple_staff; struct Simple_column : Staff_column { Request *the_note; + Stem_req *stem_; + Simple_staff* staff_; /****************/ - + virtual void typeset_stem(Stem_req *rq)=0; virtual void typeset_req(Request *rq)=0; virtual void typeset_command(Command *, int brs)=0; virtual void typeset_item(Item *, int=1); - Item *create_command_item(Command *com); - Item *create_req_item(Request *rq); + Molecule *create_command_mol(Command *com); + Molecule *create_req_mol(Request *rq); void take_request(Request *rq); virtual void process_commands( ); diff --git a/spanner.cc b/spanner.cc new file mode 100644 index 0000000000..f9eb65367b --- /dev/null +++ b/spanner.cc @@ -0,0 +1,32 @@ + +#include "spanner.hh" +#include "line.hh" + +#include "symbol.hh" +#include "molecule.hh" +#include "pcol.hh" + +String +Spanner::TeXstring() const +{ + assert(right->line); + Real w = left->hpos - right->hpos; + return strets->eval(w).tex; +} + +Spanner * +Spanner::broken_at(const PCol *c1, const PCol *c2) const +{ + Spanner *sp = new Spanner(*this); + sp->left = c1; + sp->right = c2; + return sp; +} + +Spanner::Spanner() +{ + pstaff_=0; + strets=0; + left = right = 0; +} + diff --git a/spanner.hh b/spanner.hh new file mode 100644 index 0000000000..542357f7a2 --- /dev/null +++ b/spanner.hh @@ -0,0 +1,33 @@ +/* + spanner.hh -- part of LilyPond + + (c) 1996 Han-Wen Nienhuys +*/ + +#ifndef SPANNER_HH +#define SPANNER_HH +#include "proto.hh" + +/// a symbol which is attached between two columns. +struct Spanner { + const PCol *left, *right; + Parametric_symbol *strets; + PStaff * pstaff_; + /// clone a piece of this spanner. + Spanner *broken_at(const PCol *c1, const PCol *c2) const; + /** + + PRE + c1 >= start, c2 <= stop + */ + /****************/ + String TeXstring () const ; + Spanner(); +}; +/** Spanner should know about the items which it should consider: + e.g. slurs should be steep enough to "enclose" all those items. This + is absolutely necessary for beams, since they have to adjust the + length of stems of notes they encompass. + + */ +#endif diff --git a/stem.cc b/stem.cc new file mode 100644 index 0000000000..33198addde --- /dev/null +++ b/stem.cc @@ -0,0 +1,90 @@ +#include "stem.hh" +#include "dimen.hh" +#include "debug.hh" +#include "pstaff.hh" +#include "pscore.hh" +#include "paper.hh" +#include "lookupsyms.hh" +#include "molecule.hh" + +const int STEMLEN=7; + +Stem::Stem(int c) +{ + minnote = maxnote = 0; + bot = top = 0; + flag = 4; + staff_center=c; +} + +void +Stem::print()const +{ + mtor << "Stem minmax=["<< minnote<<","<<maxnote<<"], flag: "<<flag; + Item::print(); +} + +void +Stem::calculate() +{ + assert(minnote<=maxnote); + int stafftop = 2*staff_center; + + if (maxnote < -2){ + bot = minnote; + top = staff_center - staff_center/2; // uhh... how about non 5-line staffs? + + }else if (minnote > stafftop + 2) { + top = maxnote; + bot = staff_center + staff_center/2; + flag = -flag; + }else { + Real mean = (minnote+maxnote)/2; + + top = (mean > staff_center) ? maxnote : maxnote+STEMLEN; + bot = (mean > staff_center) ? minnote-STEMLEN : minnote; + flag = (mean > staff_center) ? -flag : flag; + } +} + +Interval +Stem::width()const +{ + if (ABS(flag) <= 4) + return Interval(0,0); // TODO! + Paperdef*p= pstaff_->pscore_->paper_; + return p->lookup_->flag(flag).dim.x; +} + +void +Stem::brew_molecole() +{ + assert(pstaff_); + Paperdef *p = pstaff_->pscore_->paper_; + Parametric_symbol *stem = p->lookup_->stem(); + + assert(bot!=top); + assert(!output); + + Real dy = p->interline()/2; + String y1 =print_dimen( dy * bot); + String y2 = print_dimen(dy * top); + Symbol ss =stem->eval(y1,y2); + output = new Molecule(Atom(ss)); + + if (ABS(flag) > 4){ + Symbol fl = p->lookup_->flag(flag); + Molecule m(fl); + if (flag < -4){ + output->add_bot(m); + } else if (flag > 4) { + output->add_top(m); + } else + assert(false); + } + + if (flag > 0){ + Real dx = pstaff_->pscore_->paper_->note_width(); // ugh + output->translate(Offset(dx,0)); + } +} diff --git a/stem.hh b/stem.hh new file mode 100644 index 0000000000..039bc5182c --- /dev/null +++ b/stem.hh @@ -0,0 +1,31 @@ +/* + stem.hh -- part of LilyPond + + (c) 1996 Han-Wen Nienhuys +*/ + +#ifndef STEM_HH +#define STEM_HH +#include "item.hh" + +struct Stem : public Item { + // heads the stem encompasses (positions) + int minnote, maxnote; + + int staff_center; + + // extent of the stem (positions) + int bot, top; + + // flagtype? 4 none, 8 8th flag, 0 = beam. + int flag; + + + /****************/ + void brew_molecole(); + void calculate(); + Stem(int center); + void print() const; + Interval width() const; +}; +#endif diff --git a/symbol.ini b/symbol.ini index 3671dae8af..39553133ec 100644 --- a/symbol.ini +++ b/symbol.ini @@ -8,9 +8,9 @@ symboltables # the "index" entry is hardwired into lilypond. table balls - 1 \wholeball -5pt 5pt -2.5pt 2.5pt - 2 \halfball -5pt 5pt -2.5pt 2.5pt - 4 \quartball -5pt 5pt -2.5pt 2.5pt + 1 \wholeball 0pt 7.5pt -2.5pt 2.5pt + 2 \halfball 0pt 6pt -2.5pt 2.5pt + 4 \quartball 0pt 6pt -2.5pt 2.5pt end table bars @@ -37,11 +37,23 @@ end table param meter \generalmeter{%}{%} -3pt 10pt -5pt 5pt linestaf \linestafsym{%}{%} 0pt 0pt 0pt 0pt + stem \stem{%}{%} 0pt 0pt 0pt 0pt + end table dots 1 \lsingledot 0pt 8pt -1pt 1pt 2 \ldoubledot 0pt 12pt -1pt 1pt 3 \ltripledot 0pt 16pt -1pt 1pt -end +end + +table flags + 8 \eigthflag 0pt 5pt 0pt 0pt + 16 \sixteenthflag 0pt 5pt 0pt 0pt + 32 \thirtysecondflag 0pt 5pt 0pt 0pt + -8 \ieigthflag -5pt 0pt 0pt 0pt + -16 \isixteenthflag -5pt 0pt 0pt 0pt + -32 \ithirtysecondflag -5pt 0pt 0pt 0pt +end + end # symboltables
\ No newline at end of file diff --git a/symtable.cc b/symtable.cc index eedb25a4e5..e963b64d12 100644 --- a/symtable.cc +++ b/symtable.cc @@ -13,9 +13,7 @@ Symtable::lookup(String s) const if (elt_query(s)) return (*this)[s]; else { - Symbol unknown; - WARN<<"Unknown symbol " << s <<'\n'; - return unknown; + error( "Unknown symbol " +s+'\n'); } } diff --git a/template1.cc b/template1.cc index 01aba139e2..ece4e2ff18 100644 --- a/template1.cc +++ b/template1.cc @@ -5,11 +5,12 @@ #include "item.hh" #include "request.hh" #include "command.hh" +#include "spanner.hh" #include "list.cc" - #include "plist.cc" #include "cursor.cc" + #define PLC_instantiate(a) PL_instantiate(a); PL_instantiate(const a) PLC_instantiate(Line_of_score); diff --git a/template2.cc b/template2.cc index 1c54a2cb94..5e0431c42a 100644 --- a/template2.cc +++ b/template2.cc @@ -5,6 +5,7 @@ #include "staff.hh" #include "sccol.hh" #include "stcol.hh" +#include "spanner.hh" #include "list.cc" #include "plist.cc" @@ -1,14 +1,10 @@ #include "debug.hh" #include "voice.hh" -void -Voice_element::add(Request*r) +Voice::Voice(Voice const&src) { - if (r->rhythmic()) { - assert (!duration); - duration = r->duration(); - } - reqs.bottom().add(r); + PL_copy(elts, src.elts); + start = src.start; } Voice::Voice() @@ -22,13 +18,6 @@ Voice::add(Voice_element*v) elts.bottom().add(v); } -Voice_element::Voice_element() -{ - voice = 0; - group = 0; - duration = 0.0; -} - void Voice::print() const { @@ -39,6 +28,16 @@ Voice::print() const vec->print(); #endif } + +Real +Voice::last() const +{ + Real l =start; + for (PCursor<Voice_element*> vec(elts); vec.ok(); vec++) + l += vec->duration; + return l; +} +/****************************************************************/ void Voice_element::print() const { @@ -50,12 +49,29 @@ Voice_element::print() const mtor << "}\n"; #endif } +void +Voice_element::add(Request*r) +{ + if (r->rhythmic()) { + assert (!duration); + duration = r->duration(); + } + reqs.bottom().add(r); +} -Real -Voice::last() const + +Voice_element::Voice_element() { - Real l =start; - for (PCursor<Voice_element*> vec(elts); vec.ok(); vec++) - l += vec->duration; - return l; + voice = 0; + group = 0; + duration = 0.0; +} + +Voice_element::Voice_element(Voice_element const&src) +{ + duration=src.duration; + voice=src.voice; + PointerList__copy(Request*, reqs, src.reqs, clone()); + group=src.group; + assert(!granted_items.size() && !granted_spanners.size()); } @@ -14,6 +14,7 @@ struct Voice { Real when(const Voice_element*)const; Real last() const; Voice(); + Voice( Voice const&); void add(Voice_element*); void print() const; }; @@ -42,7 +43,7 @@ struct Voice_element { void add(Request*); Voice_element(); - + Voice_element(Voice_element const & src ); void print ()const; }; /** Apart from being a container for the requests, Voice_element is |