+pl 14.hwn1
+ - specialize duration.cc for lily, move out of lib/
+ - stem cleanup
+ - more SCM typechecking
+ - stafflineleading -> staff_space
+ - bf: rod distances.
+ - junk some unused code.
+
pl 13.hwn2
- paper/score column cleanups. Junk Score_column type
The website is the most convenient form to use for reading the
documentation on-line documentation. It is made by entering @example
- make website
+ make htmldoc
@end example
This does require a functioning LilyPond. The binary doesn't have to
.* TODO
. * use hash tabs iso. alist_ for elt property?
+. * TODO: junk dstream output.
. * agressive type-checking for SCM stuff.
. * use "staff-space" and "half-space" iso interline,
staff_line_leading () etc.
. * make all Feta (including dynamics) available to the user in
textual scripts. Examples: "D.S. al \coda", "\mf espress.".
. * Write script that uses --find-old-relative to do auto relativization.
-. * Junk shared cruft (duration, moment) in lib/
.* Cleanups needed
. * \$ and $ identifier syntax in examples.
-. * Junk ghost positioning objects eg, Script leans on Staffside
- leans on Staff.
. * Key_engraver, Local_key_item
. * Think of comprehensive solution for "if (grace_b == self_grace_b_)"
. * String[String.length] doesn't trap.
. * Rhythmic_column and interaction stem/rhythmic_column/note_head/dots.
-. * Duration
. * clef engraver
. * parser
. * Lookup::text -> needs to be TeX independent.
. * junk Music_iterator::first_b_
-. * Bezier
.* ACCIDENTALS
. * half-sharps, half-flats
.* Beams
. * [c8. c16 c16 c16] in 6/8 timesig.
. * Rewrite Stem, Beam (hairy)
-. * general shaving on Beam and Stem
-. * use plet grouping
-. * beams over bars
+. * beams over barlines
. * Rests and beams don't work too well together. Example:
[ r8 g''16 des'] [r8 c16 a]
. * autoBeamMelisma: if I explicitly beam notes in a staff with auto
MAJOR_VERSION=1
MINOR_VERSION=3
PATCH_LEVEL=14
-MY_PATCH_LEVEL=
+MY_PATCH_LEVEL=hwn1
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
-/*
- acursor.hh -- declare ACursor, PACursor
-
- source file of the Flower Library
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef ACURSOR_HH
-#define ACURSOR_HH
-
-template<class T>
-class ACursor
-{
-protected:
- int idx_;
- Array<T> &arr_;
-public:
- ACursor (ACursor const& s)
- :arr_(s.arr_)
- {
- idx_ = s.idx_;
- }
- ACursor (Array<T> const &arr)
- arr_((Array<T>&)arr)
- {
- idx_ =0;
- }
- T thing() const {
- return arr_[idx_];
- }
- T& thing() { return arr_[idx_]; }
- T& operator++(int) {
- T&t = thing();
- idx_ ++;
- return t;
- }
- bool ok() { return idx_ >=0 && idx_ < arr_.size (); }
-};
-
-
-template<class T>
-class PACursor : public ACursor<T*>
-{
-public:
- PACursor (Link_array<T> l)
- : ACursor (l)
- {
- }
- T* ptr() { return arr_[idx_]; }
- T *operator->() {
- return ptr();
- }
-
-};
-
-#endif // ACURSOR_HH
-/*
- full-storage.icc -- implement Full_storage inline functions
-
- source file of the Flower Library
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef FULL_STORAGE_ICC
-#define FULL_STORAGE_ICC
-
-
-INLINE void
-Full_storage::init()
-{
- els_p_p_=0;
- band_i_ = 0;
- height_i_=width_i_=max_height_i_=max_width_i_=0;
-}
-
-INLINE bool
-Full_storage::valid (int i, int j) const
-{
- return (i>=0 && i < height_i_)
- && (j < width_i_ && j >=0);
-}
-
-
-INLINE
-Full_storage::Full_storage (Full_storage const&s)
-{
- init();
- (*this) = s;
-}
-
-INLINE Real&
-Full_storage::elem (int i,int j)
-{
- assert (valid (i,j));
- return els_p_p_[i][j];
-}
-
-INLINE Real
-Full_storage::elem (int i, int j) const {
- assert (valid (i,j));
- return els_p_p_[i][j];
-}
-
-INLINE
-Full_storage::Full_storage() {
- init();
-}
-
-
-INLINE int
-Full_storage::rows() const
-{
- return height_i_;
-}
-
-INLINE int
-Full_storage::cols() const
-{
- return width_i_;
-}
-
-INLINE int
-Full_storage::dim() const
-{
- assert (rows()==cols ());
- return rows();
-}
-
-INLINE void
-Full_storage::resize (int i)
-{
- resize (i,i);
-}
-
-INLINE
-Full_storage::Full_storage (int i,int j)
-{
- init();
- set_size (i,j);
-}
-
-INLINE
-Full_storage::Full_storage (int i)
-{
- init();
- set_size (i);
-}
-
-
-INLINE
-bool
-Full_storage::mult_ok (int i, int ) const
-{
- return i < height_i_;
-}
-
-INLINE
-bool
-Full_storage::trans_ok (int , int j) const
-{
- return j < width_i_;
-}
-
-
-INLINE
-void
-Full_storage::trans_next (int &i, int &j) const
-{
- assert (trans_ok (i,j));
- i++;
- if (i >= height_i_)
- {
- i= (0 >? j - band_i_);
- j ++;
- }
-}
-
-INLINE
-void
-Full_storage::mult_next (int &i, int &j) const
-{
- assert (mult_ok (i,j));
- j++;
- if (j >= width_i_)
- {
- j= 0 >? (i - band_i_);
- i++;
- }
-}
-#endif // FULL_STORAGE_ICC
-#ifndef HANDLE_HH
-#define HANDLE_HH
-
-/// reference counting handle
-template<class T>
-class Handle {
- T *obj;
- int *refs;
-
- /// let go of ref. Delete if necessary
- void down() {
- if (!(*refs--)) {
- delete obj;
- delete refs;
- }
- obj = 0;
- refs = 0;
- }
- /// point to new object.
- void up (T *t, int *r) {
- if (!r) {
- refs = new int;
- *refs = 1;
- } else {
- refs =r;
- *refs++;
- }
- obj = t;
- }
- /// POST: *refs == 1
- void copy() {
- if (*refs != 1){
- T * newobj = new T(*obj);
- down();
- up (newobj);
- }
- }
- Handle (Handle const &src) {
- up (src.obj, src.refs);
- }
- Handle (T & o) {
- up (&o);
- }
- void operator=(Handle const& src) {
- if (this == &src)
- return;
- down();
- up (src.o, src.refs);
- }
- operator T const &() {
- return *obj;
- }
- operator T&() {
- copy();
- return *obj;
- }
-}
-#endif
-/*
- iterate.hh -- define some list macros
-
- source file of the flowerlib
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef ITERATE_HH
-#define ITERATE_HH
-
-/*
- ugh.
- jcn: kjoet.
- if we wouldn't have had this, things might have been
- just a little bit easier to read, imho.
- (it does save quite some disk space, though)
- */
-
-#define iterator(set) typeof ((set).top())
-#define iterator_bot(set) typeof ((set).bottom())
-
-#define iter(init, var) typeof (init) var (init)
-
-// should use top()
-#define iter_top(set,var) iterator (set) var (set)
-#define iter_bot(set,var) iterator (set) var (set.bottom())
-
-#endif // ITERATE_HH
-/*
- scalar.hh -- declare
-
- source file of the Flower Library
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef SCALAR_HH
-#define SCALAR_HH
-
-struct Scalar {
- String str_;
- // Real real_;
- int int_;
- // Rational rational_;
-
-
- struct typebits {
- string_bit: 1;
- int_bit:1;
- };
-private:
-
-
- // operator Real();
- operator int();
-
- /** perl -like string to bool conversion.
- */
- // operator bool() const;
-
- //Scalar (Real r) : String (r) {}
- Scalar (int i) : String (i) {}
- // Scalar (char c) : String (c) {}
- Scalar (char const *c) : String (c) {}
- Scalar (String s):String (s) {}
- //Scalar (Rational);
- static Scalar undefined ();
-};
-
-#endif // SCALAR_HH
-/*
- priorities.hh -- declare Priorities
-
- source file of the Flower Library
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef PRIORITIES_HH
-#define PRIORITIES_HH
-
-#include "array.hh"
-
-/**
- A sorted (uni)set. Should connect with PQueue
- */
-template<class K>
-struct Priorities : Array<K>
-{
- void insert (K k)
- {
- int i=0;
- for (; i < size(); i++) {
- if (elem (i) == k)
- return;
- if (elem (i) > k)
- break;
- }
- Array<K>::insert (k, i);
- }
-};
-#endif // PRIORITIES_HH
-
-
-#error
-/*
- (c) Han-Wen Nienhuys 1995,96,97,98
-
- Distributed under GNU GPL
-*/
-
-
-#if 0
-#include "array.hh"
-#ifdef INLINE
-#undef INLINE
-#endif
-
-#define INLINE
-#endif
-
-/*
- functions with loops don't inline
- */
-
-template<class T> INLINE void
-arrcpy (T*dest, T*src, int count)
-{
- for (int i_shadows_local=0; i_shadows_local < count ; i_shadows_local++)
- *dest++ = *src++;
-}
-
-template<class T> INLINE void
-Array<T>::insert (T k, int j)
-{
- assert (j >=0 && j<= size_);
- set_size (size_+1);
- for (int i=size_-1; i > j; i--)
- array_p_[i] = array_p_[i-1];
- array_p_[j] = k;
-}
-
-template<class T> INLINE void
-Array<T>::sort (int (*compare)(T const&,T const&),
- int lower = -1, int upper = -1)
-{
- if (lower < 0)
- {
- lower = 0 ;
- upper = size () - 1;
- }
- if (lower >= upper)
- return;
- swap (lower, (lower+upper)/2);
- int last = lower;
- for (int i= lower +1; i <= upper; i++)
- if (compare (array_p_[i], array_p_[lower]) < 0)
- swap (++last,i);
- swap (lower, last);
- sort (compare, lower, last-1);
- sort (compare, last+1, upper);
-}
-
-template<class T> INLINE void
-Array<T>::reverse ()
-{
- int h = size_/2;
- for (int i =0,j = size_-1; i < h; i++,j--)
- swap (i,j);
-}
-
-/*
- scalar.cc -- implement
-
- source file of the Flower Library
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-/*
- duration-convert.cc -- implement Duration_convert
-
- source file of the LilyPond music typesetter
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
- Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-#include <assert.h>
-#include "duration-convert.hh"
-#include "duration-iter.hh"
-#include "warn.hh"
-
-// statics Duration_convert
-bool const Duration_convert::midi_as_plet_b_s = true;
-bool Duration_convert::no_quantify_b_s = false;
-bool Duration_convert::no_double_dots_b_s = false;
-bool Duration_convert::no_triplets_b_s = false;
-int Duration_convert::no_smaller_than_i_s = 0;
-Array<Duration> Duration_convert::dur_array_s;
-
-String
-Duration_convert::dur2_str (Duration dur)
-{
- if (dur.ticks_i_)
- return String ("[") + to_str (dur.ticks_i_) + "]";
-
- String str;
- if (dur.durlog_i_ >= 0)
- str = to_str ( type2_i (dur.durlog_i_) );
- else if (dur.durlog_i_ == -1)
- str = "\\breve";
- else if (dur.durlog_i_ == -2)
- str = "\\longa";
- str += to_str ('.', dur.dots_i_);
- if (dur.plet_b ())
- str += String ("*") + to_str (dur.plet_.iso_i_)
- + String ("/") + to_str (dur.plet_.type_i_);
- return str;
-}
-
-int
-Duration_convert::dur2ticks_i (Duration dur)
-{
- if (dur.ticks_i_)
- return dur.ticks_i_;
- return dur2_mom (dur) * Rational (Duration::division_1_i_s);
-}
-
-int
-Duration_convert::i2_type (int i)
-{
- int t=0;
- while (i && !(i & 1)) {
- i >>= 1;
- t++;
- }
- return t;
-}
-
-int
-Duration_convert::type2_i (int type)
-{
- if (type<0)
- return 0;
- else
- return 1 << type;
-}
-
-Rational
-Duration_convert::dur2_mom (Duration dur)
-{
- if (dur.ticks_i_)
- return Rational (dur.ticks_i_, Duration::division_1_i_s);
-
- // or simply assert?
- if (dur.durlog_i_<-10)
- return Rational (0);
- Rational mom;
- if (dur.durlog_i_<0)
- mom = Rational (type2_i (-dur.durlog_i_), 1);
- else
- mom = Rational (1 , type2_i (dur.durlog_i_));
-
- Rational delta = mom;
- while (dur.dots_i_--)
- {
- delta /= 2.0;
- mom += delta;
- }
-
- return mom * plet_factor_mom (dur);
-}
-
-Duration
-Duration_convert::mom2_dur (Rational mom)
-{
- if (!mom)
- {
- Duration dur;
- dur.set_plet (0,1);
- return dur;
- }
-
-
- Duration dur = mom2standardised_dur (mom);
- // if (!dur.mom () || (dur.mom () == mom))
- if (!dur.length_mom () || (dur.length_mom () == mom))
- return dur;
- assert (midi_as_plet_b_s);
-
- // dur.set_plet (type_mom, Duration::division_1_i_s / 4);
-
- // Rational as_plet_mom = mom / dur.mom ();
- Rational as_plet_mom = mom / dur.length_mom ();
- as_plet_mom *= dur.plet_.mom ();
- long num = as_plet_mom.num ();
- long den = as_plet_mom.den ();
- dur.set_plet (num, den);
- return dur;
-}
-
-Duration
-Duration_convert::mom2standardised_dur (Rational mom)
-{
- // if (!dur_array_s.length_i ())
- if (!dur_array_s.size ())
- set_array ();
- assert (dur_array_s.size ());
- for (int i = 0; i < dur_array_s.size () - 1; i++)
- {
- Rational lower_mom = dur2_mom (dur_array_s[ i ]);
- if (mom <= lower_mom)
- {
- // all arbitrary, but 3/4 will get rid of the noise...
- // kinda ok
- if (i || (mom / lower_mom > Rational (3, 4)))
- return dur_array_s[ i ];
- else
- {
- Duration d;
- d.durlog_i_ = -100;
- return d;
- }
- }
- Rational upper_mom = dur2_mom (dur_array_s[ i + 1 ]);
- if ((mom < upper_mom)
- && ((mom - lower_mom) / lower_mom
- < (upper_mom - mom) / upper_mom))
- return dur_array_s[ i ];
- }
- return dur_array_s[ dur_array_s.size () - 1 ];
-}
-
-void
-Duration_convert::set_array ()
-{
- dur_array_s.clear ();
-
- Duration_iterator iter_dur;
- assert (iter_dur);
- while (iter_dur)
- dur_array_s.push (iter_dur++);
-}
-
-
-Rational
-Duration_convert::plet_factor_mom (Duration dur)
-{
- return dur.plet_.mom ();
-}
-
-Real
-Duration_convert::sync_f (Duration dur, Rational mom)
-{
- return mom / dur2_mom (dur);
-}
-
-Duration
-Duration_convert::ticks2_dur (int ticks_i)
-{
- Rational mom (ticks_i, Duration::division_1_i_s);
- if (midi_as_plet_b_s)
- return mom2_dur (mom);
-
- Duration dur = mom2standardised_dur (mom);
-
- if (dur.length_mom () == mom)
- return dur;
-
- return mom2_dur (mom);
-}
-
-Duration
-Duration_convert::ticks2standardised_dur (int ticks_i)
-{
- Rational mom (ticks_i, Duration::division_1_i_s);
- Duration dur = mom2standardised_dur (mom);
- return dur;
-}
-/*
- duration-convert.cc -- implement Duration_convert
-
- source file of the LilyPond music typesetter
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
- Jan Nieuwenhuizen <janneke@gnu.org>
-*/
-#include <assert.h>
-#include "duration-convert.hh"
-#include "warn.hh"
-#include "duration-iter.hh"
-
-Duration_iterator::Duration_iterator ()
-{
- cursor_dur_.durlog_i_ = 7;
- if (Duration_convert::no_smaller_than_i_s)
- cursor_dur_.durlog_i_ = Duration_convert::no_smaller_than_i_s;
-}
-
-Duration
-Duration_iterator::operator ++(int)
-{
- return forward_dur ();
-}
-
-Duration
-Duration_iterator::operator ()()
-{
- return dur ();
-}
-
-Duration_iterator::operator bool ()
-{
- return ok ();
-}
-
-Duration
-Duration_iterator::dur ()
-{
- return cursor_dur_;
-}
-
-Duration
-Duration_iterator::forward_dur ()
-{
- /* should do smart table? guessing:
- duration wholes
- 16 0.0625
- 32.. 0.0703
- 8:2/3 0.0833
- 16. 0.0938
- 8 0.1250
- 16.. 0.1406
- 4:2/3 0.1667
- 8. 0.1875
-
- */
- assert (ok ());
-
- Duration dur = cursor_dur_;
-
- if (!cursor_dur_.dots_i_ && !cursor_dur_.plet_b ())
- {
- cursor_dur_.durlog_i_ += 1;
- cursor_dur_.dots_i_ = 2;
- }
- else if (cursor_dur_.dots_i_ == 2)
- {
- assert (!cursor_dur_.plet_b ());
- cursor_dur_.dots_i_ = 0;
- cursor_dur_.durlog_i_ -=2;
- cursor_dur_.set_plet (2, 3);
- }
- else if (cursor_dur_.plet_b ()
- && (cursor_dur_.plet_.iso_i_ == 2)
- && (cursor_dur_.plet_.type_i_ == 3))
- {
- assert (!cursor_dur_.dots_i_);
- cursor_dur_.set_plet (1, 1);
- cursor_dur_.durlog_i_ += 1;
- cursor_dur_.dots_i_ = 1;
- }
- else if (cursor_dur_.dots_i_ == 1)
- {
- assert (!cursor_dur_.plet_b ());
- cursor_dur_.dots_i_ = 0;
- cursor_dur_.durlog_i_ -= 1;
- }
-
- if (Duration_convert::no_triplets_b_s
- && cursor_dur_.plet_b () && ok ())
- forward_dur ();
- if (Duration_convert::no_double_dots_b_s
- && (cursor_dur_.dots_i_ == 2) && ok ())
- forward_dur ();
- if (Duration_convert::no_smaller_than_i_s
- && (cursor_dur_.durlog_i_ > Duration_convert::no_smaller_than_i_s) && ok ())
- forward_dur ();
- if (Duration_convert::no_smaller_than_i_s
- && cursor_dur_.dots_i_
- && (cursor_dur_.durlog_i_ >= Duration_convert::no_smaller_than_i_s)
- && ok ())
- forward_dur ();
- if (Duration_convert::no_smaller_than_i_s
- && (cursor_dur_.dots_i_ == 2)
- && (cursor_dur_.durlog_i_ >= Duration_convert::no_smaller_than_i_s / 2)
- && ok ())
- forward_dur ();
-
- return dur;
-}
-
-bool
-Duration_iterator::ok ()
-{
- return cursor_dur_.length_mom () <= Rational (4);
-}
-/*
- duration.cc -- implement Duration, Plet,
-
- source file of the LilyPond music typesetter
-
- (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
- Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
-
- UGH. Duration is broken.
-*/
-
-#include <assert.h>
-
-#include "proto.hh"
-#include "string.hh"
-#include "source-file.hh"
-#include "source.hh"
-#include "rational.hh"
-#include "duration.hh"
-#include "duration-convert.hh"
-#include "duration-iter.hh"
-
-// statics Duration
-int Duration::division_1_i_s = 384 * 4;
-
-
-Duration::Duration ()
-{
- durlog_i_ = 0;
- dots_i_ = 0;
- ticks_i_ = 0;
-}
-
-bool
-Duration::duration_type_b (int t)
-{
- /*
- ugh. Assuming behavior of conversion funcs on broken input.
- */
- return t == Duration_convert::type2_i (Duration_convert::i2_type (t));
-}
-
-void
-Duration::compress (Rational m)
-{
- plet_.iso_i_ *= m.num_i ();
- plet_.type_i_ *= m.den_i ();
-}
-
-Rational
-Duration::length_mom () const
-{
- return Duration_convert::dur2_mom (*this);
-}
-
-void
-Duration::set_plet (int i, int t)
-{
- plet_.iso_i_ = i;
- plet_.type_i_ = t;
-}
-
-/*
-void
-Duration::set_plet (Duration d)
-{
- plet_.iso_i_ = d.plet_.iso_i_;
- plet_.type_i_ = d.plet_.type_i_;
-}
-*/
-
-void
-Duration::set_ticks (int ticks_i)
-{
- assert (durlog_i_ <10);
- assert (!dots_i_);
- ticks_i_ = ticks_i;
-}
-
-String
-Duration::str () const
-{
- return Duration_convert::dur2_str (*this);
-}
-
-
-bool
-Duration::plet_b ()
-{
- return !plet_.unit_b ();
-}
-
-/*
- duration-convert.hh -- declare Duration_convert
-
- source file of the LilyPond music typesetter
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef DURATION_CONVERT_HH
-#define DURATION_CONVERT_HH
-#include "duration.hh"
-#include "string.hh"
-#include "array.hh"
-
-/**
- Duration_convert handles all conversions to -n fro Duration (dur).
- That is including (integer + division) representation for MIDI,
- and conversion from unexact time representation (best guess :-).
-
- A Rational (mom) is a Rational that holds the time fraction
- compared to a whole note (before also called wholes).
-
- [todo]
- move all statics to real members, instantiate Duration_convert
- object (s).
-*/
-struct Duration_convert {
-
- /* Urgh. statics.
- */
- static bool const midi_as_plet_b_s;
- static bool no_quantify_b_s;
- static bool no_double_dots_b_s;
- static bool no_triplets_b_s;
- static int no_smaller_than_i_s;
- static Array<Duration> dur_array_s;
-
- /// Return number of ticks in (ticks, division_1) representation
- static int dur2ticks_i (Duration dur );
-
- /// Return the type_i representation of note length i
- static int i2_type (int i);
-
- /// Return the note length corresponding to the type_i representation
- /// Return 0 if longer than whole note.
- static int type2_i (int type);
-
- /// Return Rational representation (fraction of whole note).
- static Rational dur2_mom (Duration dur );
-
- /// Return Mudela string representation.
- static String dur2_str (Duration dur );
-
- /// Return duration from Rational (fraction of whole) representation.
- static Duration mom2_dur (Rational mom );
-
- /// Return standardised duration, best guess if not exact.
- static Duration mom2standardised_dur (Rational mom );
-
- /// Return plet factor (not a Rational: should use Rational?).
- static Rational plet_factor_mom (Duration dur );
-
- static void set_array ();
-
- /** Return synchronisation factor for mom, so that
- mom2_dur (mom / sync_f ) will return the duration dur.
- */
- static Real sync_f (Duration dur, Rational mom );
-
- /// Return exact duration, in midi-ticks if not-exact.
- static Duration ticks2_dur (int ticks_i );
-
- /// Return standardised duration, best guess if not exact.
- static Duration ticks2standardised_dur (int ticks_i );
-};
-
-
-#endif // DURATION_CONVERT_HH
-/*
- duration-iter.hh -- declare Duration_iterator
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.ruu.nl>
-
- */
-
-#ifndef DURATION_ITER_HH
-#define DURATION_ITER_HH
-
-/// (iter_dur)
-struct Duration_iterator {
-
- /// start at shortest: 128:2/3
- Duration_iterator ();
-
- // **** what about these three here ?
- /// return forward_dur ();
- Duration operator ++(int);
-
- /// return ok ()
- operator bool ();
-
- /// return dur ()
- Duration operator ()();
-
-
- /// return current dur
- Duration dur ();
-
- /// return dur (), step to next
- Duration forward_dur ();
-
- /// durations left?
- bool ok ();
-
-private:
-
- Duration cursor_dur_;
-};
-
-
-
-#endif /* DURATION_ITER_HH */
-
-/*
- duration.hh -- declare Duration
-
- source file of the LilyPond music typesetter
-
- (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
-
-*/
-
-// split into 4?
-
-#ifndef DURATION_HH
-#define DURATION_HH
-
-#include "fproto.hh"
-#include "rational.hh"
-#include "plet.hh"
-
-/**
- Handle "musical" durations. This means: balltype 1,2,4,etc. and dots.
-
- (dur)
- */
-struct Duration {
- Duration ();
- /// is the "plet factor" of this note != 1 ?
- bool plet_b ();
- String str () const;
- void set_plet (int,int );
- void compress (Rational);
-
- static bool duration_type_b (int t);
- void set_ticks (int ticks_i );
- Rational length_mom () const ;
- static int division_1_i_s;
-
- /// Logarithm of the base duration.
- int durlog_i_;
- int dots_i_;
- Plet plet_;
- int ticks_i_;
-};
-#endif // DURATION_HH
-
-/*
- plet.hh -- declare Plet
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef PLET_HH
-#define PLET_HH
-#include "rational.hh"
-
-/**
- The type and replacement value of a plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3.
-
- (plet)
- */
-struct Plet {
- Plet ();
- Rational mom () const;
- bool unit_b () const;
- int iso_i_; // 2/3; 2 is not duration, maar of count!
- int type_i_;
-};
-
-#endif // PLET_HH
-//
-// windhoos-suck-suck-suck-thank-you-cygnus.hh
-//
-// mmap () should work now (cygnus beta 18), but let's keep it here
-// for people using old cygnus releases
-#if 0 //def _WINDOWS32
-#ifndef WINDHOOS_SUCK_SUCK_SUCK_HH
-#define WINDHOOS_SUCK_SUCK_SUCK_HH
-
-caddr_t mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset);
-
-int munmap (caddr_t addr, size_t len);
-
-#endif // WINDHOOS_SUCK_SUCK_SUCK_HH
-#endif // _WINDOWS32 //
-/*
- plet.cc -- implement Plet
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-#include "plet.hh"
-
-
-Plet::Plet ()
-{
- type_i_ = 1;
- iso_i_ = 1;
-}
-
-Rational
-Plet::mom () const
-{
- return Rational (iso_i_, type_i_);
-}
-
-bool
-Plet::unit_b () const
-{
- return type_i_ == 1 && iso_i_ == 1;
-}
-
-//
-// windhoos.cc
-//
-// mmap () should work now (cygnus beta 18), but let's keep it here
-// for people using old cygnus releases
-#if 0 // def _WINDOWS32
-
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <winbase.h>
-#include "thank-you-cygnus.hh"
-
-/*
-HANDLE CreateFileMapping (
- HANDLE hFile, // handle to file to map
- LPSECURITY_ATTRIBUTES lpFileMappingAttributes, // optional security attributes
- DWORD flProtect, // protection for mapping object
- DWORD dwMaximumSizeHigh, // high-order 32 bits of object size
- DWORD dwMaximumSizeLow, // low-order 32 bits of object size
- LPCTSTR lpName // name of file-mapping object
-);
-
-
-LPVOID MapViewOfFile (
- HANDLE hFileMappingObject, // file-mapping object to map into address space
- DWORD dwDesiredAccess, // access mode
- DWORD dwFileOffsetHigh, // high-order 32 bits of file offset
- DWORD dwFileOffsetLow, // low-order 32 bits of file offset
- DWORD dwNumberOfBytesToMap // number of bytes to map
-);
-
-
-io.h:
-long _get_osfhandle (int filehandle);
-*/
-
-// cygnus's gnu-win32-b17.1 does not have _get_osfhandle
-// however, after some hacking, it turns out that:
-
-static const int OSF_OFFSET_i = 72;
-static const int OSF_BASE_i = -3;
-static const int OSF_FACTOR_i = 8;
-// let-s hope bill doesn-t change his mind any time soon :-)
-
-// so that, while waiting for cygnus's mmap, we can write:
-
-// #define HAVE_GET_OSFHANDLE // no we still cannot; works only with cl.exe
-long
-_get_osfhandle (int filedes_i)
-{
- return (long)(OSF_OFFSET_i + (filedes_i + OSF_BASE_i) * OSF_FACTOR_i);
-}
-
-#ifdef HAVE_GET_OSFHANDLE
-
-#include <iostream.h>
-
-caddr_t
-mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
-{
- (void)flags;
- (void)prot;
- (void)addr;
- HANDLE osf = (HANDLE)_get_osfhandle (fd);
- HANDLE file_handle = CreateFileMapping (osf, (void*)0, PAGE_READONLY,
- 0, len, 0);
- return (caddr_t)MapViewOfFile (file_handle, FILE_MAP_READ, 0, offset, len);
-}
-
-
-int
-munmap (caddr_t addr, size_t len)
-{
- (void)len;
- return UnmapViewOfFile (addr);
-}
-
-#else // ! HAVE_GET_OSFHANDLE //
-
-caddr_t
-mmap (caddr_t addr, size_t len, int prot, int flags, int fd, off_t offset)
-{
- (void)flags;
- (void)prot;
- (void)addr;
- (void)offset;
- char* ch_p = new char[ len ];
- if (ch_p)
- read (fd, (void*)ch_p, len);
- return ch_p;
-}
-
-
-int
-munmap (caddr_t addr, size_t len)
-{
- (void)len;
- delete (char*)addr;
- return 0;
-}
-
-#endif // !HAVE_GET_OSFHANDLE //
-
-
-#endif // _WINDOWS32 //
-#include "warn.hh"
#include <stream.h>
+#include "warn.hh"
+
void
error (String s)
cerr << _("programming error: ") << s << _(" (Continuing; cross thumbs)") << '\n';
}
-void
-programming_warning (String m)
-{
- cerr << _ ("programming warning: ") << m <<endl;
-
-}
{
if (!elts_[i]->parent_l (Y_AXIS))
staffline_p_->add_element (elts_[i]);
- else if (elts_[i]->get_elt_property ("Axis_group_element::add_extra_element") == SCM_UNDEFINED
- && ! dynamic_cast<Axis_group_element*> (elts_[i]->parent_l (Y_AXIS)))
+ else
+ if (
+ // elts_[i]->get_elt_property ("Axis_group_element::add_extra_element") == SCM_UNDEFINED &&
+ ! dynamic_cast<Axis_group_element*> (elts_[i]->parent_l (Y_AXIS)))
{
staffline_p_->add_element (elts_[i]);
{
Stem *s = stem (i);
SCM force = s->remove_elt_property ("dir-forced");
- if (force == SCM_UNDEFINED)
+ if (!gh_boolean_p (force) || !gh_scm2bool (force))
s->set_direction (d);
}
}
bool knee_b = false;
int knee_y = 0;
SCM gap = get_elt_property (gap_str);
- if (gap != SCM_UNDEFINED)
+ if (gh_number_p (gap))
{
int auto_gap_i = gh_scm2int (gap);
for (int i=1; i < stem_count (); i++)
gh_int2scm (multiplicity),
SCM_UNDEFINED));
Real shorten_f = gh_scm2double (shorten)
- * Staff_symbol_referencer_interface (this).staff_line_leading_f ();
+ * Staff_symbol_referencer_interface (this).staff_space ();
/* cute, but who invented this -- how to customise ? */
if (forced_fraction < 1)
Stem* s = stem (i);
if (s->invisible_b ())
continue;
- if (s->get_elt_property ("shorten") == SCM_UNDEFINED)
+ if (gh_number_p (s->get_elt_property ("shorten")))
s->set_elt_property ("shorten", gh_double2scm (shorten_f));
}
}
/* set or read dy as necessary */
SCM s = get_elt_property ("height");
- if (s != SCM_UNDEFINED)
+ if (gh_number_p (s))
dy = gh_scm2double (s);
else
set_elt_property ("height", gh_double2scm (dy));
/* set or read y as necessary */
s = get_elt_property ("y-position");
- if (s != SCM_UNDEFINED)
+ if (gh_number_p (s))
{
y = gh_scm2double (s);
set_stem_length (y, dy);
{
SCM damp = get_elt_property ("damping"); // remove?
int damping = 1; // ugh.
- if (damp != SCM_UNDEFINED)
+ if (gh_number_p (damp))
damping = gh_scm2int (damp);
if (damping)
return dy;
Staff_symbol_referencer_interface st (this);
- Real interline_f = st.staff_line_leading_f ();
+ Real interline_f = st.staff_space ();
Real staffline_f = paper_l ()->get_var ("stafflinethickness");
Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
*/
Staff_symbol_referencer_interface sinf (this);
- Real space = sinf.staff_line_leading_f ();
+ Real space = sinf.staff_space ();
Real staffline_f = paper_l ()->get_var ("stafflinethickness");
Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
Real gap_f = 0;
SCM gap = get_elt_property ("beam-gap");
- if (gap != SCM_UNDEFINED)
+ if (gh_number_p (gap))
{
int gap_i = gh_scm2int ( (gap));
int nogap = rwholebeams - gap_i;
Molecule a;
SCM d = get_elt_property ("dashed");
- if (d == SCM_UNDEFINED)
- a = lookup_l ()->slur (one, get_direction () * thick, thick);
- else
+ if (gh_number_p (d))
a = lookup_l ()->dashed_slur (one, thick, gh_scm2int (d));
+ else
+ a = lookup_l ()->slur (one, get_direction () * thick, thick);
return new Molecule (a);
}
Bezier
Bow::get_curve () const
{
-
-
-
Bezier_bow b (paper_l (),
get_encompass_offset_arr (), get_direction ());
// urg
SCM first_pair = elems[0]->get_elt_property ("minimum-space");
- if (first_pair == SCM_UNDEFINED)
- first_pair = gh_cons (gh_double2scm (0.0), gh_double2scm (0.0));
- else
+ if (gh_pair_p (first_pair))
first_pair = first_pair;
+ else
+ first_pair = gh_cons (gh_double2scm (0.0), gh_double2scm (0.0));
scm_set_car_x (first_pair, gh_double2scm (-dists[0]));
elems[0]->set_elt_property ("minimum-space", first_pair);
{
Staff_symbol_referencer_interface si (this);
- Real dl = si.staff_line_leading_f();
+ Real dl = si.staff_space();
Interval i1(0, dl / 6), i2(-dl / 2, dl / 2);
Box b(i1, i2);
void
Breathing_sign::do_post_processing()
{
- Real dl = Staff_symbol_referencer_interface (this).staff_line_leading_f();
+ Real dl = Staff_symbol_referencer_interface (this).staff_space();
translate_axis(2.0 * dl * get_direction (), Y_AXIS);
}
Jan Nieuwenhuizen <janneke@gnu.org>
*/
-#include "duration-convert.hh"
#include "timing-translator.hh"
#include "chord-tremolo-engraver.hh"
#include "stem.hh"
add_dependency (g); // just to be sure.
SCM my_vis = get_elt_property ("visibility-lambda");
- if (my_vis != SCM_UNDEFINED)
+ if (gh_procedure_p (my_vis))
g->set_elt_property ("visibility-lambda", my_vis);
}
Score_element * se = unsmob_element ( gh_car (s));
SCM force = se->remove_elt_property ("force-hshift");
- if (force != SCM_UNDEFINED)
+ if (gh_number_p (force))
{
tups. push (Shift_tup (se, gh_scm2double (force)));
}
--- /dev/null
+/*
+ duration.cc -- implement Duration, Plet,
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
+ Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+*/
+
+#include <assert.h>
+
+#include "lily-proto.hh"
+#include "string.hh"
+#include "moment.hh"
+#include "duration.hh"
+
+Duration::Duration ()
+{
+ durlog_i_ = 0;
+ dots_i_ = 0;
+ tuplet_iso_i_ = 1;
+ tuplet_type_i_ = 1;
+}
+
+void
+Duration::compress (Rational m)
+{
+ tuplet_type_i_ *= m.num_i ();
+ tuplet_iso_i_ *= m.den_i ();
+}
+
+Rational
+Duration::length_mom () const
+{
+ Rational mom (1 << abs (durlog_i_));
+
+ if (durlog_i_> 0)
+ mom = Moment (1)/mom;
+
+ Rational delta = mom;
+
+ for (int d = dots_i_; d; d--)
+ {
+ delta /= 2.0;
+ mom += delta;
+ }
+
+ return mom * Moment (tuplet_iso_i_, tuplet_type_i_);
+}
+
+void
+Duration::set_plet (int i, int t)
+{
+ tuplet_iso_i_ = i;
+ tuplet_type_i_ = t;
+}
+
+
+String
+Duration::str () const
+{
+ return to_str (durlog_i_) + to_str ('.', dots_i_);
+}
+
+
+bool
+Duration::plet_b ()
+{
+ return tuplet_iso_i_ != 1 || tuplet_type_i_ != 1;
+}
+
+
if (pc->original_l_)
{
SCM pen = pc->get_elt_property ("penalty");
- if (pen != SCM_UNDEFINED)
+ if (gh_number_p (pen))
{
break_penalties += gh_scm2double (pen);
}
Hara_kiri_group_spanner::do_post_processing ()
{
SCM worth = get_elt_property ("items-worth-living");
- if (worth != SCM_EOL && worth != SCM_UNDEFINED)
+ if (gh_pair_p (worth))
return;
Link_array<Score_element> childs = get_children ();
void banter (Array<Musical_pitch> pitch_arr, Chord_mol* name_p) const;
Chord_name (Chord const& c);
+
+ /*
+ ugh. Junkme, I must be elt property.
+ */
+
Chord chord_;
protected:
--- /dev/null
+/*
+ duration.hh -- declare Duration
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
+
+*/
+
+#ifndef DURATION_HH
+#define DURATION_HH
+
+#include "fproto.hh"
+#include "rational.hh"
+
+
+/**
+ A musical duration.
+ */
+struct Duration {
+ Duration ();
+ /// is the "plet factor" of this note != 1 ?
+ bool plet_b ();
+ String str () const;
+ void set_plet (int,int );
+ void compress (Rational);
+ Rational length_mom () const ;
+
+ /// Logarithm of the base duration.
+ int durlog_i_;
+ int dots_i_;
+ int tuplet_iso_i_; // 2/3; 2 is not duration, maar of count!
+ int tuplet_type_i_;
+
+};
+#endif // DURATION_HH
+
--- /dev/null
+/*
+ plet.hh -- declare Plet
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+
+#ifndef PLET_HH
+#define PLET_HH
+#include "rational.hh"
+
+/**
+ The type and replacement value of a plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3.
+
+ (plet)
+ */
+struct Plet {
+ Plet ();
+ Rational mom () const;
+ bool unit_b () const;
+};
+
+#endif // PLET_HH
typeface. ie. leading is vertical space.
*/
- Real staff_line_leading_f () const;
+ Real staff_space () const;
Staff_symbol * staff_symbol_l () const;
int lines_i () const;
Real position_f () const;
public:
/// this many lines.
int no_lines_i_;
- Real staff_line_leading_f_;
- Real staff_line_leading_f ();
+ Real staff_space_;
+ Real staff_space ();
Staff_symbol ();
class Stem : public Item,
public Directional_element
{
-
- /**extent of the stem (positions).
- fractional, since Beam has to adapt them.
- */
- Interval yextent_;
-
public:
/// log of the duration. Eg. 4 -> 16th note -> 2 flags
int flag_i () const;
Note_head * first_head () const;
Score_element * support_head () const;
Stem ();
+
/// ensure that this Stem also encompasses the Notehead #n#
void add_head (Rhythmic_head*n);
int type_i () const;
void set_stemend (Real);
Direction get_default_dir() const;
-
int get_center_distance(Direction) const;
+ Real get_default_stemlen() const;
+
+ void position_noteheads();
- void set_default_stemlen();
- void set_default_extents();
- void set_noteheads();
+ Real stem_end_position () const;
- Real stem_end_f() const;
- Real stem_begin_f() const;
+ // todo: cleanup, naming
Real note_delta_f () const;
bool invisible_b() const;
Item::try_visibility_lambda ()
{
SCM vis = remove_elt_property ("visibility-lambda");
- if (vis != SCM_UNDEFINED)
+ if (gh_procedure_p (vis))
{
SCM args = scm_listify (gh_int2scm (break_status_dir ()), SCM_UNDEFINED);
SCM result = gh_apply (vis, args);
Molecule*output = new Molecule;
Staff_symbol_referencer_interface si (this);
- Real inter = si.staff_line_leading_f ()/2.0;
+ Real inter = si.staff_space ()/2.0;
int j;
if ((break_status_dir () == LEFT || break_status_dir () == CENTER)
{
Molecule*output = new Molecule;
Staff_symbol_referencer_interface si (this);
- Real note_distance = si.staff_line_leading_f ()/2;
+ Real note_distance = si.staff_space ()/2;
Molecule *octave_mol_p = 0;
int lastoct = -100;
String
Midi_event::str () const
{
- int delta_i = delta_mom_ * Moment (Duration::division_1_i_s);
+ int delta_i = delta_mom_ * Moment (384 * 4); // ugh.
+
String delta_str = Midi_item::i2varint_str (delta_i);
String midi_str = midi_p_->str ();
assert (midi_str.length_i ());
Molecule s;
bool rest_symbol=true;
SCM alt_symbol_sym =get_elt_property ("alt-symbol");
- if (alt_symbol_sym != SCM_UNDEFINED)
+ if (gh_string_p (alt_symbol_sym))
{
s = lookup_l () -> afm_find (ly_scm2string (alt_symbol_sym));
rest_symbol = false;
mol_p->add_molecule (s);
Real interline_f
- = staff_symbol_referencer_interface (this).staff_line_leading_f ();
+ = staff_symbol_referencer_interface (this).staff_space ();
if (measures_i_ == 1 && rest_symbol)
{
mol_p->translate_axis (interline_f, Y_AXIS);
SCM s1 = p1->get_elt_property ("horizontal-shift");
SCM s2 = p2->get_elt_property ("horizontal-shift");
- int h1 = (s1 == SCM_UNDEFINED) ? 0 : gh_scm2int (s1);
- int h2 = (s2 == SCM_UNDEFINED) ? 0 : gh_scm2int (s2);
+ int h1 = (gh_number_p (s1))? gh_scm2int (s1) :0;
+ int h2 = (gh_number_p (s2)) ? gh_scm2int (s2):0;
return h1 - h2;
}
Score_element * se = unsmob_element (gh_car (s));
Staff_symbol_referencer_interface si (se);
- se->translate_axis (dy_i * si.staff_line_leading_f ()/2.0, Y_AXIS);
+ se->translate_axis (dy_i * si.staff_space ()/2.0, Y_AXIS);
}
}
Real beam_y = 0;
SCM s = b->get_elt_property ("height");
- if (s != SCM_UNDEFINED)
+ if (gh_number_p (s))
beam_dy = gh_scm2double (s);
s = b->get_elt_property ("y-position");
- if (s != SCM_UNDEFINED)
+ if (gh_number_p (s))
beam_y = gh_scm2double (s);
Real x0 = b->first_visible_stem ()->hpos_f ();
Score_element * se = unsmob_element (gh_car (s));
Staff_symbol_referencer_interface si (se);
- Real staff_space = si.staff_line_leading_f ();
+ Real staff_space = si.staff_space ();
Real rest_dim = extent (Y_AXIS)[d]*2.0 /staff_space ;
Real minimum_dist
{
Staff_symbol_referencer_interface si (this);
- Real inter_f = si.staff_line_leading_f ()/2;
+ Real inter_f = si.staff_space ()/2;
int sz = si.lines_i ()-1;
Real p = si.position_f ();
int streepjes_i = abs (p) < sz
String type;
SCM style = get_elt_property ("style");
- if (style != SCM_UNDEFINED)
+ if (gh_string_p (style))
{
type = ly_scm2string (style);
}
#include "translator-group.hh"
#include "score.hh"
#include "music-list.hh"
-#include "duration-convert.hh"
#include "change-translator.hh"
#include "file-results.hh"
#include "scope.hh"
// mmm
Mudela_version oldest_version ("1.3.4");
+bool
+is_duration_b (int t)
+{
+ return t == 1 << intlog2(t);
+}
+
+
void
$$ =b;
}
| '[' ':' unsigned {
- if (!Duration::duration_type_b ($3))
+ if (!is_duration_b ($3))
THIS->parser_error (_f ("not a duration: %d", $3));
else if ($3 < 8)
THIS->parser_error (_ ("Can't abbreviate"));
$$ = $1;
}
| duration_length '*' unsigned {
- $$->plet_.iso_i_ *= $3;
+ $$->tuplet_iso_i_ *= $3;
}
| duration_length '/' unsigned {
- $$->plet_.type_i_ *= $3;
+ $$->tuplet_type_i_ *= $3;
}
;
steno_duration:
unsigned {
$$ = new Duration;
- if (!Duration::duration_type_b ($1))
+ if (!is_duration_b ($1))
THIS->parser_error (_f ("not a duration: %d", $1));
else {
- $$->durlog_i_ = Duration_convert::i2_type ($1);
+ $$->durlog_i_ = intlog2 ($1);
}
}
| DURATION_IDENTIFIER {
$$ =0;
}
| ':' unsigned {
- if (!Duration::duration_type_b ($2))
+ if (!is_duration_b ($2))
THIS->parser_error (_f ("not a duration: %d", $2));
else if ($2 < 8)
THIS->parser_error (_ ("Can't abbreviate"));
Real staff_space = paper_l()->get_var ("interline");
/* FIXME
- staff_space = rcol->rest_l_arr[0]->staff_line_leading_f ();
+ staff_space = rcol->rest_l_arr[0]->staff_space ();
*/
Real internote_f = staff_space/2;
Real minimum_dist = paper_l ()->get_var ("restcollision_minimum_dist")
String style;
SCM style_sym =get_elt_property ("style");
- if (balltype_i () >= 2 && style_sym != SCM_UNDEFINED)
+ if (balltype_i () >= 2 &&gh_string_p ( style_sym))
{
style = ly_scm2string (style_sym);
}
{
Score_element * urg = (Score_element*)this;
SCM sz = urg->remove_elt_property ("fontsize");
- int i = (sz != SCM_UNDEFINED)
+ int i = (gh_number_p (sz))
? gh_scm2int (sz)
: 0;
for (SCM s = get_elt_property ("elements"); gh_pair_p (s) && gh_pair_p (gh_cdr (s)); s = gh_cdr (s))
{
- SCM elt = gh_car (s);
- SCM next_elt = gh_cadr (s);
+ /*
+ Order of elements is reversed!
+ */
+ SCM elt = gh_cadr (s);
+ SCM next_elt = gh_car (s);
Single_malt_grouping_item *l = dynamic_cast<Single_malt_grouping_item*> (unsmob_element (elt));
Single_malt_grouping_item *r = dynamic_cast<Single_malt_grouping_item*> (unsmob_element ( next_elt));
Direction dir = Side_position_interface (me).get_direction ();
SCM pad = me->remove_elt_property ("padding");
- if (pad != SCM_UNDEFINED)
+ if (gh_number_p (pad))
{
off += gh_scm2double (pad) * dir;
}
rp += d;
}
- return (rp - p) * si.staff_line_leading_f () / 2.0;
+ return (rp - p) * si.staff_space () / 2.0;
}
return 0.0;
}
SCM next_stretch_hint = rc->get_elt_property ("stretch-distance");
Real left_distance;
- if (hint != SCM_UNDEFINED)
+ if (gh_pair_p (hint))
{
left_distance = gh_scm2double (gh_cdr (hint));
}
Real right_dist = 0.0;
- if (next_hint != SCM_UNDEFINED)
+ if (gh_pair_p (next_hint))
{
right_dist += - gh_scm2double (gh_car (next_hint));
}
else
stretch_dist += left_distance;
- if (next_stretch_hint != SCM_UNDEFINED)
+ if (gh_pair_p (next_stretch_hint))
// see regtest spacing-tight
stretch_dist += - gh_scm2double (gh_car (next_stretch_hint));
else
else
{
Staff_symbol_referencer_interface si (this);
- return (si.lines_i () -1) * si.staff_line_leading_f ();
+ return (si.lines_i () -1) * si.staff_space ();
}
}
SCM sz (get_property ("staffLineLeading", 0));
if (gh_number_p(sz))
{
- span_p_->staff_line_leading_f_ = gh_scm2double (sz);
+ span_p_->staff_space_ = gh_scm2double (sz);
}
else
{
- span_p_->staff_line_leading_f_ = paper_l ()->get_var ("interline");
+ span_p_->staff_space_ = paper_l ()->get_var ("interline");
}
span_p_->set_bounds(RIGHT,get_staff_info().command_pcol_l ());
typeset_element (span_p_);
}
Real
-Staff_symbol_referencer_interface::staff_line_leading_f () const
+Staff_symbol_referencer_interface::staff_space () const
{
Staff_symbol * st = staff_symbol_l ();
if (st)
- return st->staff_line_leading_f_;
+ return st->staff_space_;
else if (elt_l_->pscore_l_ && elt_l_->paper_l ())
elt_l_->paper_l ()->get_var ("interline");
Real y = elt_l_->relative_coordinate (c, Y_AXIS)
- st->relative_coordinate (c, Y_AXIS);
- p += 2.0 * y / st->staff_line_leading_f ();
+ p += 2.0 * y / st->staff_space ();
}
else
{
Real off =0.0;
if (gh_number_p (pos))
{
- Real space = staff_symbol_referencer_interface (sc).staff_line_leading_f ();
+ Real space = staff_symbol_referencer_interface (sc).staff_space ();
off = gh_scm2double (pos) * space/2.0;
}
sc->set_elt_property ("staff-position", gh_double2scm (0.0));
Staff_symbol::Staff_symbol ()
{
no_lines_i_ = 5;
- staff_line_leading_f_ = 5.0 PT;
+ staff_space_ = 5.0 PT;
}
void
Molecule rule = lookup_l ()->filledbox (Box (Interval (0,width),
Interval (-t/2, t/2)));
- Real height = (no_lines_i_-1) * staff_line_leading_f_ /2;
+ Real height = (no_lines_i_-1) * staff_space_ /2;
Molecule * m = new Molecule;
for (int i=0; i < no_lines_i_; i++)
{
Molecule a (rule);
- a.translate_axis (height - i * staff_line_leading_f_, Y_AXIS);
+ a.translate_axis (height - i * staff_space_, Y_AXIS);
m->add_molecule (a);
}
return no_lines_i_*2;
}
Real
-Staff_symbol::staff_line_leading_f ()
+Staff_symbol::staff_space ()
{
- return staff_line_leading_f_;
+ return staff_space_;
}
#include "note-head.hh"
#include "stem.hh"
#include "musical-request.hh"
-#include "duration-convert.hh"
#include "misc.hh"
#include "stem-tremolo.hh"
#include "staff-info.hh"
{
Stem_tremolo * s = dynamic_cast<Stem_tremolo*> (c->element_l ());
Real space = Staff_symbol_referencer_interface (s->stem_l ())
- .staff_line_leading_f ();
+ .staff_space ();
return Interval (-space, space);
}
Real interbeam_f = paper_l ()->interbeam_f (mult);
Real w = gh_scm2double (get_elt_property ("beam-width"));
- Real space = Staff_symbol_referencer_interface (st).staff_line_leading_f ();
+ Real space = Staff_symbol_referencer_interface (st).staff_space ();
Real internote_f = space / 2;
Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));
{
Real dy = 0;
SCM s = st->beam_l ()->get_elt_property ("height");
- if (s != SCM_UNDEFINED)
+ if (gh_number_p (s))
dy = gh_scm2double (s);
Real dx = st->beam_l ()->last_visible_stem ()->hpos_f ()
- st->beam_l ()->first_visible_stem ()->hpos_f ();
if (st->beam_l ())
{
beams->translate (Offset(st->hpos_f () - hpos_f (),
- st->stem_end_f () * internote_f -
+ st->stem_end_position () * internote_f -
st->beam_l ()->get_direction () * beams_i * interbeam_f));
}
else
? -st->get_direction () * st->note_delta_f ()/2
: 0.0;
- dy += st->stem_end_f ();
+ dy += st->stem_end_position ();
beams->translate (Offset(st->hpos_f () - hpos_f ()+
whole_note_correction, dy));
}
return r;
}
-Real
-Stem::stem_begin_f () const
-{
- return yextent_[Direction(-get_direction ())];
-}
Real
Stem::chord_start_f () const
{
return head_positions()[get_direction ()]
- * Staff_symbol_referencer_interface (this).staff_line_leading_f ()/2.0;
+ * Staff_symbol_referencer_interface (this).staff_space ()/2.0;
}
Real
-Stem::stem_end_f () const
+Stem::stem_end_position () const
{
- return yextent_[get_direction ()];
+ SCM p =get_elt_property ("stem-end-position");
+ Real len;
+ if (!gh_number_p (p))
+ {
+ Stem * me = (Stem*) this;
+ len = get_default_stemlen ();
+ me->set_elt_property ("stem-end-position", gh_double2scm (len));
+ }
+ else
+ len = gh_scm2double (p);
+
+ return len;
}
void
Stem::set_stemend (Real se)
{
// todo: margins
- if (get_direction () && get_direction () * head_positions()[get_direction ()] >= se*get_direction ())
+ Direction d= get_direction ();
+
+ if (d && d * head_positions()[get_direction ()] >= se*d)
warning (_ ("Weird stem size; check for narrow beams"));
-
- yextent_[get_direction ()] = se;
- yextent_[Direction(-get_direction ())] = head_positions()[-get_direction ()];
+ set_elt_property ("stem-end-position", gh_double2scm (se));
}
int
int pos = -inf;
Direction dir = get_direction ();
-
Note_head *nh =0;
for (SCM s = get_elt_property ("heads"); gh_pair_p (s); s = gh_cdr (s))
{
if (p > pos)
{
nh = n;
+ pos = p;
}
}
return Direction (int(paper_l ()->get_var ("stem_default_neutral_direction")));
}
-void
-Stem::set_default_stemlen ()
+Real
+Stem::get_default_stemlen () const
{
Real length_f = 0.;
SCM scm_len = get_elt_property("length");
- if (scm_len != SCM_UNDEFINED)
+ if (gh_number_p (scm_len))
{
length_f = gh_scm2double (scm_len);
}
/* URGURGURG
'set-default-stemlen' sets direction too
- */
- if (!get_direction ())
- set_direction (get_default_dir ());
-
+ */
+ Direction dir = get_direction ();
+ if (!dir)
+ {
+ Stem * me = (Stem*) this;
+ dir = get_default_dir ();
+ me->set_direction (dir);
+ }
+
/*
stems in unnatural (forced) direction should be shortened,
according to [Roush & Gourlay]
if (((int)chord_start_f ())
&& (get_direction () != get_default_dir ()))
length_f -= shorten_f;
-
+
+ /*
+ UGK.!
+ */
if (flag_i () >= 5)
length_f += 2.0;
if (flag_i () >= 6)
length_f += 1.0;
+
+
- set_stemend ((get_direction () > 0) ? head_positions()[BIGGER] + length_f:
- head_positions()[SMALLER] - length_f);
+ Real st = head_positions()[-dir] + dir * length_f;
bool no_extend_b = get_elt_property ("no-stem-extend") != SCM_UNDEFINED;
- if (!grace_b && !no_extend_b && (get_direction () * stem_end_f () < 0))
- set_stemend (0);
+ if (!grace_b && !no_extend_b && dir * st < 0)
+ st = 0.0;
+
+ return st;
}
int
return (gh_number_p (s)) ? gh_scm2int (s) : 2;
}
-//xxx
-void
-Stem::set_default_extents ()
-{
- if (yextent_.empty_b ())
- set_default_stemlen ();
-}
-
void
-Stem::set_noteheads ()
+Stem::position_noteheads ()
{
if (!first_head ())
return;
heads[i]->translate_axis (w - heads[i]->extent (X_AXIS)[dir], X_AXIS);
}
- bool parity= true;
+ bool parity= true; // todo: make this settable.
int lastpos = int (Staff_symbol_referencer_interface (heads[0]).position_f ());
for (int i=1; i < heads.size (); i ++)
{
void
Stem::do_pre_processing ()
{
- if (yextent_.empty_b ())
- set_default_extents ();
- set_noteheads ();
+ get_default_stemlen (); // ugh. Trigger direction calc.
+ position_noteheads ();
if (invisible_b ())
{
TODO: more advanced: supply height of noteheads as well, for more advanced spacing possibilities
*/
-
void
Stem::set_spacing_hints ()
{
Stem::do_brew_molecule_p () const
{
Molecule *mol_p =new Molecule;
- Interval stem_y = yextent_;
+
+ Staff_symbol_referencer_interface si (first_head ());
+
+ Real y1 = si.position_f();
+ Real y2 = stem_end_position ();
+
+ Interval stem_y(y1,y2);
+ stem_y.unite (Interval (y2,y1));
+
Real dy = staff_symbol_referencer_interface (this)
- .staff_line_leading_f ()/2.0;
+ .staff_space ()/2.0;
Real head_wid = 0;
if (support_head ())
Stem_info info;
Real internote_f
- = staff_symbol_referencer_interface (this).staff_line_leading_f ()/2;
- Real interbeam_f = paper_l ()->interbeam_f (beam_l ()->get_multiplicity ());
+ = staff_symbol_referencer_interface (this).staff_space ()/2;
+ Real interbeam_f = paper_l ()->interbeam_f (beam_l ()->get_multiplicity ());
Real beam_f = gh_scm2double (beam_l ()->get_elt_property ("beam-thickness"));
info.idealy_f_ = chord_start_f ();
// for simplicity, we calculate as if dir == UP
info.idealy_f_ *= beam_dir;
-
- bool grace_b = get_elt_property ("grace") != SCM_UNDEFINED;
- bool no_extend_b = get_elt_property ("no-stem-extend") != SCM_UNDEFINED;
+ SCM grace_prop = get_elt_property ("grace");
+ bool grace_b = gh_boolean_p (grace_prop) && gh_scm2bool (grace_prop);
+ SCM extend_prop = get_elt_property ("no-stem-extend");
+ bool no_extend_b = gh_boolean_p (extend_prop) && gh_scm2bool (extend_prop);
int stem_max = (int)rint(paper_l ()->get_var ("stem_max"));
String type_str = grace_b ? "grace_" : "";
{
if (beam_l ()->get_multiplicity ())
{
- info.idealy_f_ += beam_f;
- info.idealy_f_ += (beam_l ()->get_multiplicity () - 1) * interbeam_f;
+ info.idealy_f_ += beam_f
+ + (beam_l ()->get_multiplicity () - 1) * interbeam_f;
}
info.miny_f_ = info.idealy_f_;
info.maxy_f_ = INT_MAX;
*/
if (!grace_b && !no_extend_b)
{
- //highest beam of (UP) beam must never be lower than middle staffline
- info.miny_f_ = info.miny_f_ >? 0;
- //lowest beam of (UP) beam must never be lower than second staffline
- info.miny_f_ = info.miny_f_ >? (- 2 * internote_f - beam_f
- + (beam_l ()->get_multiplicity () > 0) * beam_f + interbeam_f * (beam_l ()->get_multiplicity () - 1));
+ /* highest beam of (UP) beam must never be lower than middle staffline
+
+ lowest beam of (UP) beam must never be lower than second staffline
+ */
+ info.miny_f_ =
+ info.miny_f_ >? 0
+ >? (- 2 * internote_f - beam_f
+ + (beam_l ()->get_multiplicity () > 0) * beam_f
+ + interbeam_f * (beam_l ()->get_multiplicity () - 1));
}
}
else
info.idealy_f_ -= stem_f;
info.maxy_f_ -= min_stem_f;
}
-
- info.idealy_f_ = info.maxy_f_ <? info.idealy_f_;
- info.idealy_f_ = info.miny_f_ >? info.idealy_f_;
-
- Real interstaff_f = calc_interstaff_dist (this, beam_l ());
+
+ info.idealy_f_ = (info.maxy_f_ <? info.idealy_f_) >? info.miny_f_;
SCM s = beam_l ()->get_elt_property ("shorten");
- if (s != SCM_UNDEFINED)
+ if (gh_number_p (s))
info.idealy_f_ -= gh_double2scm (s);
- info.idealy_f_ += interstaff_f * beam_dir;
- info.miny_f_ += interstaff_f * beam_dir;
- info.maxy_f_ += interstaff_f * beam_dir;
+ Real interstaff_f = beam_dir* calc_interstaff_dist (this, beam_l ());
+
+ info.idealy_f_ += interstaff_f;
+ info.miny_f_ += interstaff_f;
+ info.maxy_f_ += interstaff_f ;
return info;
}
Text_item::do_brew_molecule_p () const
{
SCM style = get_elt_property ("style");
- String st = (style == SCM_UNDEFINED) ? "" : ly_scm2string (style);
+ String st = gh_string_p (style) ? ly_scm2string (style) : "";
Molecule a= paper_l ()->lookup_l(0)->text (st, text_str_, paper_l ());
{
SCM st = get_elt_property ("style");
- if (st != SCM_UNDEFINED)
+ if (gh_string_p (st))
{
String style (ly_scm2string (st));
if (style[0]=='1')
if (is_alias_b (n) && (id_str_ == id || id.empty_b ()))
return this;
-
Translator_group* r = 0;
- for (Cons<Translator> *p = trans_p_list_.head_; p; p = p->next_)
+ for (Cons<Translator> *p = trans_p_list_.head_; !r && p; p = p->next_)
{
if (Translator_group *trg = dynamic_cast <Translator_group *> (p->car_))
r = trg->find_existing_translator_l (n, id);
{
Direction d = UP;
SCM dir_sym =get_elt_property ("dir-forced");
- if (dir_sym != SCM_UNDEFINED) {
- d= (Direction) gh_scm2int (dir_sym);
- if (d != CENTER)
- return d;
- }
+ if (gh_number_p (dir_sym))
+ {
+ d= (Direction) gh_scm2int (dir_sym);
+ if (d != CENTER)
+ return d;
+ }
for (SCM s = get_elt_property ("columns"); gh_pair_p (s); s = gh_cdr (s))
{
--- /dev/null
+/*
+ duration-convert.cc -- implement Duration_convert
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+#include <assert.h>
+#include "duration-convert.hh"
+#include "duration-iter.hh"
+#include "warn.hh"
+
+// statics Duration_convert
+bool const Duration_convert::midi_as_plet_b_s = true;
+bool Duration_convert::no_quantify_b_s = false;
+bool Duration_convert::no_double_dots_b_s = false;
+bool Duration_convert::no_triplets_b_s = false;
+int Duration_convert::no_smaller_than_i_s = 0;
+Array<Duration> Duration_convert::dur_array_s;
+
+String
+Duration_convert::dur2_str (Duration dur)
+{
+ if (dur.ticks_i_)
+ return String ("[") + to_str (dur.ticks_i_) + "]";
+
+ String str;
+ if (dur.durlog_i_ >= 0)
+ str = to_str ( type2_i (dur.durlog_i_) );
+ else if (dur.durlog_i_ == -1)
+ str = "\\breve";
+ else if (dur.durlog_i_ == -2)
+ str = "\\longa";
+ str += to_str ('.', dur.dots_i_);
+ if (dur.plet_b ())
+ str += String ("*") + to_str (dur.plet_.iso_i_)
+ + String ("/") + to_str (dur.plet_.type_i_);
+ return str;
+}
+
+int
+Duration_convert::dur2ticks_i (Duration dur)
+{
+ if (dur.ticks_i_)
+ return dur.ticks_i_;
+ return dur2_mom (dur) * Rational (Duration::division_1_i_s);
+}
+
+int
+Duration_convert::i2_type (int i)
+{
+ int t=0;
+ while (i && !(i & 1)) {
+ i >>= 1;
+ t++;
+ }
+ return t;
+}
+
+int
+Duration_convert::type2_i (int type)
+{
+ if (type<0)
+ return 0;
+ else
+ return 1 << type;
+}
+
+Rational
+Duration_convert::dur2_mom (Duration dur)
+{
+ if (dur.ticks_i_)
+ return Rational (dur.ticks_i_, Duration::division_1_i_s);
+
+ // or simply assert?
+ if (dur.durlog_i_<-10)
+ return Rational (0);
+ Rational mom;
+ if (dur.durlog_i_<0)
+ mom = Rational (type2_i (-dur.durlog_i_), 1);
+ else
+ mom = Rational (1 , type2_i (dur.durlog_i_));
+
+ Rational delta = mom;
+ while (dur.dots_i_--)
+ {
+ delta /= 2.0;
+ mom += delta;
+ }
+
+ return mom * plet_factor_mom (dur);
+}
+
+Duration
+Duration_convert::mom2_dur (Rational mom)
+{
+ if (!mom)
+ {
+ Duration dur;
+ dur.set_plet (0,1);
+ return dur;
+ }
+
+
+ Duration dur = mom2standardised_dur (mom);
+ // if (!dur.mom () || (dur.mom () == mom))
+ if (!dur.length_mom () || (dur.length_mom () == mom))
+ return dur;
+ assert (midi_as_plet_b_s);
+
+ // dur.set_plet (type_mom, Duration::division_1_i_s / 4);
+
+ // Rational as_plet_mom = mom / dur.mom ();
+ Rational as_plet_mom = mom / dur.length_mom ();
+ as_plet_mom *= dur.plet_.mom ();
+ long num = as_plet_mom.num ();
+ long den = as_plet_mom.den ();
+ dur.set_plet (num, den);
+ return dur;
+}
+
+Duration
+Duration_convert::mom2standardised_dur (Rational mom)
+{
+ // if (!dur_array_s.length_i ())
+ if (!dur_array_s.size ())
+ set_array ();
+ assert (dur_array_s.size ());
+ for (int i = 0; i < dur_array_s.size () - 1; i++)
+ {
+ Rational lower_mom = dur2_mom (dur_array_s[ i ]);
+ if (mom <= lower_mom)
+ {
+ // all arbitrary, but 3/4 will get rid of the noise...
+ // kinda ok
+ if (i || (mom / lower_mom > Rational (3, 4)))
+ return dur_array_s[ i ];
+ else
+ {
+ Duration d;
+ d.durlog_i_ = -100;
+ return d;
+ }
+ }
+ Rational upper_mom = dur2_mom (dur_array_s[ i + 1 ]);
+ if ((mom < upper_mom)
+ && ((mom - lower_mom) / lower_mom
+ < (upper_mom - mom) / upper_mom))
+ return dur_array_s[ i ];
+ }
+ return dur_array_s[ dur_array_s.size () - 1 ];
+}
+
+void
+Duration_convert::set_array ()
+{
+ dur_array_s.clear ();
+
+ Duration_iterator iter_dur;
+ assert (iter_dur);
+ while (iter_dur)
+ dur_array_s.push (iter_dur++);
+}
+
+
+Rational
+Duration_convert::plet_factor_mom (Duration dur)
+{
+ return dur.plet_.mom ();
+}
+
+Real
+Duration_convert::sync_f (Duration dur, Rational mom)
+{
+ return mom / dur2_mom (dur);
+}
+
+Duration
+Duration_convert::ticks2_dur (int ticks_i)
+{
+ Rational mom (ticks_i, Duration::division_1_i_s);
+ if (midi_as_plet_b_s)
+ return mom2_dur (mom);
+
+ Duration dur = mom2standardised_dur (mom);
+
+ if (dur.length_mom () == mom)
+ return dur;
+
+ return mom2_dur (mom);
+}
+
+Duration
+Duration_convert::ticks2standardised_dur (int ticks_i)
+{
+ Rational mom (ticks_i, Duration::division_1_i_s);
+ Duration dur = mom2standardised_dur (mom);
+ return dur;
+}
--- /dev/null
+/*
+ duration-convert.cc -- implement Duration_convert
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+ Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+#include <assert.h>
+#include "duration-convert.hh"
+#include "warn.hh"
+#include "duration-iter.hh"
+
+Duration_iterator::Duration_iterator ()
+{
+ cursor_dur_.durlog_i_ = 7;
+ if (Duration_convert::no_smaller_than_i_s)
+ cursor_dur_.durlog_i_ = Duration_convert::no_smaller_than_i_s;
+}
+
+Duration
+Duration_iterator::operator ++(int)
+{
+ return forward_dur ();
+}
+
+Duration
+Duration_iterator::operator ()()
+{
+ return dur ();
+}
+
+Duration_iterator::operator bool ()
+{
+ return ok ();
+}
+
+Duration
+Duration_iterator::dur ()
+{
+ return cursor_dur_;
+}
+
+Duration
+Duration_iterator::forward_dur ()
+{
+ /* should do smart table? guessing:
+ duration wholes
+ 16 0.0625
+ 32.. 0.0703
+ 8:2/3 0.0833
+ 16. 0.0938
+ 8 0.1250
+ 16.. 0.1406
+ 4:2/3 0.1667
+ 8. 0.1875
+
+ */
+ assert (ok ());
+
+ Duration dur = cursor_dur_;
+
+ if (!cursor_dur_.dots_i_ && !cursor_dur_.plet_b ())
+ {
+ cursor_dur_.durlog_i_ += 1;
+ cursor_dur_.dots_i_ = 2;
+ }
+ else if (cursor_dur_.dots_i_ == 2)
+ {
+ assert (!cursor_dur_.plet_b ());
+ cursor_dur_.dots_i_ = 0;
+ cursor_dur_.durlog_i_ -=2;
+ cursor_dur_.set_plet (2, 3);
+ }
+ else if (cursor_dur_.plet_b ()
+ && (cursor_dur_.plet_.iso_i_ == 2)
+ && (cursor_dur_.plet_.type_i_ == 3))
+ {
+ assert (!cursor_dur_.dots_i_);
+ cursor_dur_.set_plet (1, 1);
+ cursor_dur_.durlog_i_ += 1;
+ cursor_dur_.dots_i_ = 1;
+ }
+ else if (cursor_dur_.dots_i_ == 1)
+ {
+ assert (!cursor_dur_.plet_b ());
+ cursor_dur_.dots_i_ = 0;
+ cursor_dur_.durlog_i_ -= 1;
+ }
+
+ if (Duration_convert::no_triplets_b_s
+ && cursor_dur_.plet_b () && ok ())
+ forward_dur ();
+ if (Duration_convert::no_double_dots_b_s
+ && (cursor_dur_.dots_i_ == 2) && ok ())
+ forward_dur ();
+ if (Duration_convert::no_smaller_than_i_s
+ && (cursor_dur_.durlog_i_ > Duration_convert::no_smaller_than_i_s) && ok ())
+ forward_dur ();
+ if (Duration_convert::no_smaller_than_i_s
+ && cursor_dur_.dots_i_
+ && (cursor_dur_.durlog_i_ >= Duration_convert::no_smaller_than_i_s)
+ && ok ())
+ forward_dur ();
+ if (Duration_convert::no_smaller_than_i_s
+ && (cursor_dur_.dots_i_ == 2)
+ && (cursor_dur_.durlog_i_ >= Duration_convert::no_smaller_than_i_s / 2)
+ && ok ())
+ forward_dur ();
+
+ return dur;
+}
+
+bool
+Duration_iterator::ok ()
+{
+ return cursor_dur_.length_mom () <= Rational (4);
+}
--- /dev/null
+/*
+ duration.cc -- implement Duration, Plet,
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
+ Han-Wen Nienhuys <hanwen@cs.uu.nl>
+
+
+ UGH. Duration is broken.
+*/
+
+#include <assert.h>
+
+#include "proto.hh"
+#include "string.hh"
+#include "source-file.hh"
+#include "source.hh"
+#include "rational.hh"
+#include "duration.hh"
+#include "duration-convert.hh"
+#include "duration-iter.hh"
+
+// statics Duration
+int Duration::division_1_i_s = 384 * 4;
+
+
+Duration::Duration ()
+{
+ durlog_i_ = 0;
+ dots_i_ = 0;
+ ticks_i_ = 0;
+}
+
+bool
+Duration::duration_type_b (int t)
+{
+ /*
+ ugh. Assuming behavior of conversion funcs on broken input.
+ */
+ return t == Duration_convert::type2_i (Duration_convert::i2_type (t));
+}
+
+void
+Duration::compress (Rational m)
+{
+ plet_.iso_i_ *= m.num_i ();
+ plet_.type_i_ *= m.den_i ();
+}
+
+Rational
+Duration::length_mom () const
+{
+ return Duration_convert::dur2_mom (*this);
+}
+
+void
+Duration::set_plet (int i, int t)
+{
+ plet_.iso_i_ = i;
+ plet_.type_i_ = t;
+}
+
+/*
+void
+Duration::set_plet (Duration d)
+{
+ plet_.iso_i_ = d.plet_.iso_i_;
+ plet_.type_i_ = d.plet_.type_i_;
+}
+*/
+
+void
+Duration::set_ticks (int ticks_i)
+{
+ assert (durlog_i_ <10);
+ assert (!dots_i_);
+ ticks_i_ = ticks_i;
+}
+
+String
+Duration::str () const
+{
+ return Duration_convert::dur2_str (*this);
+}
+
+
+bool
+Duration::plet_b ()
+{
+ return !plet_.unit_b ();
+}
+
--- /dev/null
+/*
+ duration-convert.hh -- declare Duration_convert
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+
+#ifndef DURATION_CONVERT_HH
+#define DURATION_CONVERT_HH
+#include "duration.hh"
+#include "string.hh"
+#include "array.hh"
+
+/**
+ Duration_convert handles all conversions to -n fro Duration (dur).
+ That is including (integer + division) representation for MIDI,
+ and conversion from unexact time representation (best guess :-).
+
+ A Rational (mom) is a Rational that holds the time fraction
+ compared to a whole note (before also called wholes).
+
+ [todo]
+ move all statics to real members, instantiate Duration_convert
+ object (s).
+*/
+struct Duration_convert {
+
+ /* Urgh. statics.
+ */
+ static bool const midi_as_plet_b_s;
+ static bool no_quantify_b_s;
+ static bool no_double_dots_b_s;
+ static bool no_triplets_b_s;
+ static int no_smaller_than_i_s;
+ static Array<Duration> dur_array_s;
+
+ /// Return number of ticks in (ticks, division_1) representation
+ static int dur2ticks_i (Duration dur );
+
+ /// Return the type_i representation of note length i
+ static int i2_type (int i);
+
+ /// Return the note length corresponding to the type_i representation
+ /// Return 0 if longer than whole note.
+ static int type2_i (int type);
+
+ /// Return Rational representation (fraction of whole note).
+ static Rational dur2_mom (Duration dur );
+
+ /// Return Mudela string representation.
+ static String dur2_str (Duration dur );
+
+ /// Return duration from Rational (fraction of whole) representation.
+ static Duration mom2_dur (Rational mom );
+
+ /// Return standardised duration, best guess if not exact.
+ static Duration mom2standardised_dur (Rational mom );
+
+ /// Return plet factor (not a Rational: should use Rational?).
+ static Rational plet_factor_mom (Duration dur );
+
+ static void set_array ();
+
+ /** Return synchronisation factor for mom, so that
+ mom2_dur (mom / sync_f ) will return the duration dur.
+ */
+ static Real sync_f (Duration dur, Rational mom );
+
+ /// Return exact duration, in midi-ticks if not-exact.
+ static Duration ticks2_dur (int ticks_i );
+
+ /// Return standardised duration, best guess if not exact.
+ static Duration ticks2standardised_dur (int ticks_i );
+};
+
+
+#endif // DURATION_CONVERT_HH
--- /dev/null
+/*
+ duration-iter.hh -- declare Duration_iterator
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1998--1999 Han-Wen Nienhuys <hanwen@cs.ruu.nl>
+
+ */
+
+#ifndef DURATION_ITER_HH
+#define DURATION_ITER_HH
+
+/// (iter_dur)
+struct Duration_iterator {
+
+ /// start at shortest: 128:2/3
+ Duration_iterator ();
+
+ // **** what about these three here ?
+ /// return forward_dur ();
+ Duration operator ++(int);
+
+ /// return ok ()
+ operator bool ();
+
+ /// return dur ()
+ Duration operator ()();
+
+
+ /// return current dur
+ Duration dur ();
+
+ /// return dur (), step to next
+ Duration forward_dur ();
+
+ /// durations left?
+ bool ok ();
+
+private:
+
+ Duration cursor_dur_;
+};
+
+
+
+#endif /* DURATION_ITER_HH */
+
--- /dev/null
+/*
+ duration.hh -- declare Duration
+
+ source file of the LilyPond music typesetter
+
+ (c) 1997--1999 Jan Nieuwenhuizen <janneke@gnu.org>
+
+*/
+
+// split into 4?
+
+#ifndef DURATION_HH
+#define DURATION_HH
+
+#include "fproto.hh"
+#include "rational.hh"
+#include "plet.hh"
+
+/**
+ Handle "musical" durations. This means: balltype 1,2,4,etc. and dots.
+
+ (dur)
+ */
+struct Duration {
+ Duration ();
+ /// is the "plet factor" of this note != 1 ?
+ bool plet_b ();
+ String str () const;
+ void set_plet (int,int );
+ void compress (Rational);
+
+ static bool duration_type_b (int t);
+ void set_ticks (int ticks_i );
+ Rational length_mom () const ;
+ static int division_1_i_s;
+
+ /// Logarithm of the base duration.
+ int durlog_i_;
+ int dots_i_;
+ Plet plet_;
+ int ticks_i_;
+};
+#endif // DURATION_HH
+
--- /dev/null
+/*
+ plet.hh -- declare Plet
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+
+#ifndef PLET_HH
+#define PLET_HH
+#include "rational.hh"
+
+/**
+ The type and replacement value of a plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3.
+
+ (plet)
+ */
+struct Plet {
+ Plet ();
+ Rational mom () const;
+ bool unit_b () const;
+ int iso_i_; // 2/3; 2 is not duration, maar of count!
+ int type_i_;
+};
+
+#endif // PLET_HH
--- /dev/null
+/*
+ plet.cc -- implement Plet
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+*/
+
+#include "plet.hh"
+
+
+Plet::Plet ()
+{
+ type_i_ = 1;
+ iso_i_ = 1;
+}
+
+Rational
+Plet::mom () const
+{
+ return Rational (iso_i_, type_i_);
+}
+
+bool
+Plet::unit_b () const
+{
+ return type_i_ == 1 && iso_i_ == 1;
+}
+