#include "matrix-storage.hh"
#include "vector.hh"
+#include "offset.hh"
/** a Real matrix. This is a class for a nonsquare block of #Real#s. The
implementation of sparse matrices is done in the appropriate #smat#
/// set this to m1*m2.
void set_product (Matrix const &m1, Matrix const &m2);
-
Vector left_multiply (Vector const &) const;
Matrix operator-() const;
\stemdown;
%% \[4/5c8( c ''c c c\]1/1 c c c )c |
\[4/5c8( c ''f c c\]1/1 c c c )c |
+
\[4/5c8( c \stemup ''f \stemdown c c\]1/1 c c c )c |
\stemup;
\octave c'';
\[4/5c8( c f'' c c\]1/1 c c c )c |
\[4/5c8( c \stemdown f'' \stemup c c\]1/1 c c c )c |
-% \octave c''';
\stemboth;
c4( 'c16 'e 'g 'b d f a )'c16 c4 |
c4( 'c16 'e 'g 'b d f f )'c16 c4 |
be more generous regarding beam position between stafflines
*/
Real q = (yspan_f / interline_f - yspan_i) * interline_f;
- if (q < interline_f / 3 - beam_thickness / 2)
+ if ((quantisation_ < NORMAL) && (q < interline_f / 3 - beam_thickness / 2))
left_pos = (Pos) (left_pos | INTER);
+
if (multiple_i_ > 1)
left_pos = (Pos) (dir_ > 0 ? HANG : SIT);
- // ugh, rounding problems!
+ // ugh, rounding problems! (enge floots)
const Real EPSILON = interline_f / 10;
do
{
left_y_ += dy * dir_;
quantise_left_y (left_pos, dy);
dy = 0;
- for (int j=0; j < stems_.size (); j++)
+ for (int i=0; i < stems_.size (); i++)
{
- Stem *s = stems_[j];
+ Stem *s = stems_[i];
if (s->transparent_b_)
continue;
Real x = s->hpos_f () - x0;
s->set_stemend (left_y_ + slope_f_ * x);
Real y = s->stem_length_f ();
- int mult = max (stems_[j]->beams_left_i_, stems_[j]->beams_right_i_);
- if (mult > 1)
+ // duh:
+ int mult_i = stems_[i]->beams_left_i_ >? stems_[i]->beams_right_i_;
+ if (mult_i > 1)
// dim(y) = internote
- y -= (Real)(mult - 1) * interbeam_f / internote_f;
- if (y < MINIMUM_STEMLEN[mult])
- dy = dy >? (MINIMUM_STEMLEN[mult] - y);
+ y -= (Real)(mult_i - 1) * interbeam_f / internote_f;
+ if (y < MINIMUM_STEMLEN[mult_i])
+ dy = dy >? (MINIMUM_STEMLEN[mult_i] - y);
}
} while (abs (dy) > EPSILON);
}
#ifndef BEZIER_HH
#define BEZIER_HH
+#ifndef STANDALONE
#include "lily-proto.hh"
+#endif
+
#include "real.hh"
+#include "curve.hh"
/**
Simple bezier curve
{
public:
Bezier (int steps_i);
- virtual ~Bezier ();
/**
Calculate bezier curve into Offset (x,y) array.
*/
- void calc (Offset control[4]);
+ void calc ();
+
+ void set (Array<Offset> points);
/**
Return y that goes with x by interpolation.
*/
Real y (Real x);
- int steps_i_;
- Offset* curve_;
+ Curve curve_;
+ Curve control_;
};
/**
/**
Calculate bezier curve for bow from bow parameters.
*/
- void calc (Real dx, Real dy, Real h, Real d);
+ void blow_fit ();
+ Real calc_f (Real height);
+ void calc ();
+ void calc_controls ();
+ void calc_default (Real h);
+ void calc_return (Real begin_alpha, Real end_alpha);
+ bool check_fit_bo ();
+ Real check_fit_f ();
+ void set (Array<Offset> points, int dir);
+ void transform ();
+ void transform_controls_back ();
+
Paper_def* paper_l_;
+ Curve encompass_;
+ int dir_;
+ Real alpha_;
+ Offset origin_;
+ Curve return_;
};
#endif // BEZIER_HH
+
#include "debug.hh"
#include "boxes.hh"
#include "bezier.hh"
+#include "main.hh"
+
+IMPLEMENT_IS_TYPE_B1(Slur,Spanner);
void
Slur::add (Note_column*n)
do
{
- if (extrema[d] != spanned_drul_[d])
+ if (extrema[d] != spanned_drul_[d])
{
dx_f_drul_[d] = -d
*(spanned_drul_[d]->width ().length () -0.5*nw_f);
{
dy_f_drul_[d] = (int)rint (extrema[d]->stem_l_->height ()[dir_]);
/* normal slur from notehead centre to notehead centre, minus gap */
- dx_f_drul_[d] += -d * gap_f;
+ // ugh: diff between old and new slurs
+ if (!experimental_features_global_b)
+ dx_f_drul_[d] += -d * gap_f;
+ else
+ dx_f_drul_[d] += 0.5 * nw_f - d * gap_f;
}
else
{
while (flip(&d) != LEFT);
}
-static Real
-pos_correct (Real x, Real dx, Real dy)
+Real
+Slur::height_f () const
{
+ Bezier_bow bow (paper ());
+ Array<Offset> notes = get_notes ();
+ bow.set (notes, dir_);
+
+ Real height = 0;
+ Real dy1 = bow.calc_f (height);
+ if (!dy1)
+ return height;
+
+ height = dy1;
+ bow.set (notes, dir_);
+ Real dy2 = bow.calc_f (height);
+ if (!dy2)
+ return height;
+
+ if (abs (dy2 - dy1) < paper ()->rule_thickness ())
+ return height;
+
/*
- guess how much we can safely increase 'h'
- parameter of bow without taking too large
- or too many steps.
- empiric computer science
+ Assume
+ dy = B (h)
+ with
+ B (h) = a * h + b;
+
+ Then we get for height = h{dy=0}
*/
-// return (1.0 + 2.0 * x / dx) / 4.0;
- return 1.0;
+ Real a = (dy2 - dy1) / dy1;
+ Real b = dy1;
+ height = -b / a;
+
+ if (check_debug && !monitor->silent_b ("Slur"))
+ {
+ cout << "************" << endl;
+ cout << "dy1: " << dy1 << endl;
+ cout << "dy2: " << dy2 << endl;
+ cout << "a: " << a << endl;
+ cout << "b: " << b << endl;
+ cout << "h: " << height << endl;
+ }
+
+ return height;
}
-Real
-Slur::height_f () const
+Molecule*
+Slur::brew_molecule_p () const
{
- return 0.0;
+ if (!experimental_features_global_b)
+ return Bow::brew_molecule_p ();
+
+ Molecule* mol_p = new Molecule;
+ Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
+
+ Real dx_f = width ().length ();
+ dx_f += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+
+ Atom a = paper ()->lookup_l ()->control_slur (get_controls (), dx_f, dy_f);
+
+ Real interline_f = paper ()->interline_f ();
+ Real gap_f = interline_f / 2; // 5;
+ Real nw_f = paper ()->note_width ();
+ a.translate (Offset (dx_f + 0.5 * nw_f + gap_f, dy_f + dy_f_drul_[LEFT]));
+ mol_p->add (a);
+ return mol_p;
+}
+
+Array<Offset>
+Slur::get_notes () const
+{
Real interline = paper ()->interline_f ();
Real notewidth = paper ()->note_width ();
Real internote = interline / 2;
- /*
- having the correct (i.e. exactly the same as the ps stuff)
- x,y coordinates is essential.
- getting them is quite a mess, currently.
- */
-
- Stem* left_stem =encompass_arr_[0]->stem_l_;
+ Stem* left_stem = encompass_arr_[0]->stem_l_;
Real left_x = left_stem->hpos_f ();
// ugh, do bow corrections (see brew_mol)
left_x += dx_f_drul_[LEFT] + 0.5 * notewidth;
-// Real left_y = left_stem->dir_ == dir_ ? left_stem->stem_end_f () + dir_
-// : left_stem->stem_begin_f () + 0.5 * dir_;
-// left_y *= internote;
- // ugh, do bow corrections (see brew_mol)
-// left_y = dy_f_drul_[LEFT];
-
// ugh, do bow corrections (see brew_mol)
Real left_y = dy_f_drul_[LEFT];
-
// ugh, where does this asymmetry come from?
if (dir_ == DOWN)
left_y -= dir_ * internote;
- Real dx = width ().length ();
- Real dy = (dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]);
- Real centre_x = dx / 2;
-
-
- // ugh, need staffheight for bow damping
- Bezier_bow b (paper ());
-
- if (check_debug && !monitor->silent_b ("Slur"))
+ /*
+ urg, corrections for broken slurs: extra begin or end position
+ */
+ int first = 0;
+ int n = encompass_arr_.size ();
+ if (encompass_arr_[0] != spanned_drul_[LEFT])
{
- cout << "*****************" << endl;
- cout << "dir: " << (int)dir_ << endl;
- cout << "dx: " << dx << endl;
- cout << "dy: " << dy << endl;
- cout << "centre: " << centre_x << endl;
- for (int i = 0; i < encompass_arr_.size (); i++)
- cout << "i: " << i << " x: "
- << encompass_arr_[i]->stem_l_->hpos_f () - left_x << endl;
+ n += 1;
+ first = 1;
+ left_x = spanned_drul_[LEFT]->width ().length ();
+ left_y = 0;
}
- Real height = 0;
- Real dh = 0;
- do
- {
- height += dh;
- dh = 0;
- b.calc (dx, dy, height, dir_);
-
- if (check_debug && !monitor->silent_b ("Slur"))
- cout << "----" << endl;
- for (int i = 1; i < encompass_arr_.size () - 1; i++)
- {
- Stem* stem = encompass_arr_[i]->stem_l_;
- /*
- set x to middle of notehead or on exact x position of stem,
- according to slur direction
- */
- Real x = stem->hpos_f () - left_x + notewidth / 2;
- if (stem->dir_ != dir_)
- x += notewidth / 2;
- else if (stem->dir_ == UP)
- x += notewidth;
- Real y = stem->dir_ == dir_ ? stem->stem_end_f ()
- : stem->stem_begin_f () + 1.5 * dir_;
-
- /*
- leave a gap: slur mustn't touch head/stem
- */
- y += 2.5 * dir_;
- y *= internote;
- y -= left_y;
-
- Real shift = dir_ * (y - b.y (x));
+ if (encompass_arr_.top () != spanned_drul_[RIGHT])
+ n += 1;
- if (check_debug && !monitor->silent_b ("Slur"))
- {
- cout << "x: " << x << " (" << abs (centre_x - x) << ")" << endl;
- cout << "y: " << y << ", curve: " << b.y (x) << endl;
- cout << "shift: " << shift << endl;
- }
+ Array<Offset> notes;
+ notes.set_size (n);
- if (shift > 0.1 * internote)
- dh = dh >? shift * pos_correct (abs (centre_x - x), dx, dy);
- }
- } while (dh);
+ Real dx = width ().length ();
+ dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+ dx = dx <? 1000;
+ dx = dx >? 2 * interline;
+
+ Real dy = (dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]);
+ if (abs (dy) > 1000)
+ dy = sign (dy) * 1000;
+
+ notes[0].x () = 0;
+ notes[0].y () = 0;
+ notes[n - 1].x () = dx;
+ notes[n - 1].y () = dy;
+ for (int i = 1; i < n - 1; i++)
+ {
+ Stem* stem = encompass_arr_[i - first]->stem_l_;
+ /*
+ set x to middle of notehead or on exact x position of stem,
+ according to slur direction
+ */
+ Real x = stem->hpos_f () - left_x + notewidth / 2;
+ if (stem->dir_ != dir_)
+ x += notewidth / 2;
+ else if (stem->dir_ == UP)
+ x += notewidth;
+ Real y = stem->dir_ == dir_ ? stem->stem_end_f ()
+ : stem->stem_begin_f () + 2.5 * dir_;
+
+ /*
+ leave a gap: slur mustn't touch head/stem
+ */
+ y += 2.5 * dir_;
+ y *= internote;
+ y -= left_y;
+
+ notes[i].x () = x;
+ notes[i].y () = y;
+ }
+ return notes;
+}
- return height;
+Array<Offset>
+Slur::get_controls () const
+{
+ Bezier_bow b (paper ());
+ b.set (get_notes (), dir_);
+ b.calc ();
+ Array<Offset> controls;
+ controls.set_size (8);
+ for (int i = 0; i < 4; i++)
+ controls[i] = b.control_[i];
+ for (int i = 0; i < 4; i++)
+ controls[i + 4] = b.return_[i];
+ return controls;
}
-IMPLEMENT_IS_TYPE_B1(Slur,Spanner);
Interval v = support_height();
// ugh, dim[y] = PT over here
- y = v[dir_] + 1 * dir_ * inter_f;
+ y = v[dir_] + 2 * dir_ * inter_f;
int y_i = (int)rint (y / inter_f);
// ugh: 5 -> staff_lines
\documentclass{article} %UGH
\usepackage{a4}
+% UGH UGH
\advance\oddsidemargin-30mm
\evensidemargin\oddsidemargin
% ugh, centre
\advance\textwidth60mm
-\hsize210mm
-\vsize269mm
-\advance\topmargin-25mm
-\advance\textheight50mm
-\pagestyle{empty}
+\advance\topmargin-20mm
+\addtolength{\textheight}{40mm}
+\footskip5mm
+
+\usepackage{fancyheadings}
+\lhead{}
+\rhead{}
+\chead{}
+\lfoot{}
+\cfoot{\ifnum\thepage=1{\hfill\LilyIdString}\fi}
+\rfoot{\ifnum\thepage>1{\hfill\thepage\hfill}\fi}
+
+\headrulewidth0mm
+\pagestyle{fancy}
+\thispagestyle{fancy}
\input titledefs
-
\input lilyponddefs
\def\interscoreline{\vskip2mm}
%ugh
--- /dev/null
+\documentclass{article} %UGH
+
+\usepackage{a4}
+
+% UGH UGH
+% ugh, centre
+\advance\oddsidemargin-30mm
+\evensidemargin\oddsidemargin
+\advance\textwidth60mm
+\advance\topmargin-20mm
+\addtolength{\textheight}{40mm}
+\footskip5mm
+
+\usepackage{fancyheadings}
+\lhead{}
+\rhead{}
+\chead{}
+\lfoot{}
+\cfoot{\ifnum\thepage=1{\hfill\LilyIdString}\fi}
+\rfoot{\ifnum\thepage>1{\hfill\thepage\hfill}\fi}
+
+\headrulewidth0mm
+\pagestyle{fancy}
+\thispagestyle{fancy}
+
+
+\begin{document}
+\input lilyponddefs
+\input titledefs
+\def\interscoreline{\vskip3mm}
+\title{La Feria\normalsize\\[2ex]Los Toros}
+\composer{Paul Lac\^ome d'Estalenx (1838-1920)}
+%\instrument{} % heu
+%#%\tempo{M\"a\ss ig}
+\makelilytitle
+\input{los-toros-oboe-1.tex}
+\end{document}
+
\documentclass{article} %UGH
+
\usepackage{a4}
-%
% UGH UGH
-\advance\oddsidemargin-30mm
+\advance\oddsidemargin-25mm
\evensidemargin\oddsidemargin
% ugh, centre
-\advance\textwidth60mm
+\advance\textwidth40mm
\advance\topmargin-20mm
\addtolength{\textheight}{40mm}
-\pagestyle{empty}
+\footskip5mm
+
+\usepackage{fancyheadings}
+\lhead{}
+\rhead{}
+\chead{}
+\lfoot{}
+\cfoot{\ifnum\thepage=1{\hfill\LilyIdString}\fi}
+\rfoot{\ifnum\thepage>1{\hfill\thepage\hfill}\fi}
+
+\headrulewidth0mm
+\pagestyle{fancy}
+\thispagestyle{fancy}
+
+
\begin{document}
\input lilyponddefs
\input titledefs
%#%\tempo{M\"a\ss ig}
\makelilytitle
\input{los-toros-oboe.tex}
-%\input lelie.tex
+% \input{los-toros-oboe-1.tex}
\end{document}
+
\header{
filename = "los-toros-oboe.ly";
-title = "Los Toros";
+title = "La Feria\normalsize\\[2ex]Los Toros";
opus = "";
-composer = "Paul Lac\^ome d'Estalenx (1838-1920)";
+composer = "Paul Lac\\^ome d'Estalenx (1838-1920)";
enteredby = "jcn";
copyright = "public domain";
}
+%{
+Silly latex file dropped; use ly2dvi
+%}
+
\include "paper20.ly"
hoboonestart = \melodic{
[bes16-. bes-. bes-. bes-.] [bes8-. ces'->] |
[bes'16-.\ff bes'-. bes'-. bes'-.] [bes'8-. ces''16->] r16^"court"-\fermata |
% ugh: eight measures rest (ugh: r1 -> four beats...)
+ % eiht measures rest..
\textstyle "bold";
% r2^"Un peu plus lent et \\'el\\'egant"
- r2
+ r2^"\\fetanummer8"
r4 r8\p bes |
g2->^"Un peu plus lent et \\'el\\'egant" ~ |
\textstyle "italic";
a4 = \paper{
\paper_twenty
- linewidth= 165.\mm;
+ linewidth= 185.\mm;
gourlay_maxmeasures = 10.0;
- Score = \translator {
- \type Score_engraver;
-
- \consists "Timing_engraver";
- \consists "Bar_column_engraver";
- \consists "Bar_number_engraver";
-
- \consists "Span_score_bar_engraver";
- \consists "Score_priority_engraver";
- \consists "Priority_horizontal_align_engraver";
- \consists "Vertical_align_engraver";
-
+ Staff = \translator {
+ \type "Engraver_group_engraver";
+ defaultclef = violin;
- \accepts "Staff_group";
- \accepts "Staff";
- \accepts "Rhythmic_staff";
- \accepts "Lyrics";
- \accepts "Grandstaff";
+ \consists "Bar_engraver";
+ \consists "Clef_engraver";
+ \consists "Key_engraver";
+ \consists "Meter_engraver";
+ \consists "Local_key_engraver";
+ \consists "Staff_sym_engraver";
+ \consists "Collision_engraver";
+ \consists "Rest_collision_engraver";
+% not yet: multibar rest
+% \consists "Bar_column_engraver";
+% \consists "Bar_number_engraver";
+ \consists "Separating_line_group_engraver";
+ \consists "Line_group_engraver";
+
+ \accepts "Voice";
}
}
a4sixteen = \paper{
- linewidth= 165.\mm;
- Score = \translator {
- \type Score_engraver;
-
- \consists "Timing_engraver";
- \consists "Bar_column_engraver";
- \consists "Bar_number_engraver";
-
- \consists "Span_score_bar_engraver";
- \consists "Score_priority_engraver";
- \consists "Priority_horizontal_align_engraver";
- \consists "Vertical_align_engraver";
-
+ linewidth= 193.\mm;
+ Staff = \translator {
+ \type "Engraver_group_engraver";
+ defaultclef = violin;
- \accepts "Staff_group";
- \accepts "Staff";
- \accepts "Rhythmic_staff";
- \accepts "Lyrics";
- \accepts "Grandstaff";
+ \consists "Bar_engraver";
+ \consists "Clef_engraver";
+ \consists "Key_engraver";
+ \consists "Meter_engraver";
+ \consists "Local_key_engraver";
+ \consists "Staff_sym_engraver";
+ \consists "Collision_engraver";
+ \consists "Rest_collision_engraver";
+% not yet: multibar rest
+% \consists "Bar_column_engraver";
+% \consists "Bar_number_engraver";
+ \consists "Separating_line_group_engraver";
+ \consists "Line_group_engraver";
+
+ \accepts "Voice";
}
}
\score{
\$staff_hoboone
\paper{ \a4 }
-% \paper{ \a4sixteen }
\midi{
\tempo 4 = 80;
}
+ \paper{ \a4sixteen }
}
\documentclass{article} %UGH
\usepackage{a4}
+
\advance\oddsidemargin-15mm
\evensidemargin\oddsidemargin
\advance\textwidth30mm
+\footskip5mm
+
+\usepackage{fancyheadings}
+\lhead{}
+\rhead{}
+\chead{}
+\lfoot{}
+\cfoot{\ifnum\thepage=1{\hfill\LilyIdString}\fi}
+\rfoot{\ifnum\thepage>1{\hfill\thepage\hfill}\fi}
+
+\headrulewidth0mm
+\pagestyle{fancy}
+\thispagestyle{fancy}
\input titledefs
%\pagestyle{empty}
%#%\tempo{M\"a\ss ig}
\makelilytitle
\input{standchen-16.out}
-%\input lelie.tex
\end{document}
+
\documentclass{article} %UGH
\usepackage{a4}
-%
% UGH UGH
\advance\oddsidemargin-30mm
\evensidemargin\oddsidemargin
% ugh, centre
\advance\textwidth60mm
-\addtolength{\textheight}{20mm}
-\pagestyle{empty}
+\advance\topmargin-20mm
+\addtolength{\textheight}{40mm}
+\footskip5mm
+
+\usepackage{fancyheadings}
+\lhead{}
+\rhead{}
+\chead{}
+\lfoot{}
+\cfoot{\ifnum\thepage=1{\hfill\LilyIdString}\fi}
+\rfoot{\ifnum\thepage>1{\hfill\thepage\hfill}\fi}
+
+\headrulewidth0mm
+\pagestyle{fancy}
+\thispagestyle{fancy}
+
+
\begin{document}
\input lilyponddefs
\input titledefs
%#%\tempo{M\"a\ss ig}
\makelilytitle
\input{standchen-20.out}
-%\input lelie.tex
\end{document}
+