@lilypondfile{dyn-line.ly}
-Arpeggios are supported, both cross-staff and one-staff.
+Arpeggios are supported, both cross-staff and broken single staff.
@lilypondfile{arpeggio.ly}
+Simple glissando lines between notes are supported.
+
+@lilypondfile{glissando.ly}
+
@section Chord names
a1\fff\> \!a\pp
a\< \!a
\property Voice.crescendoText = "cresc."
-\property Voice.crescendoSpanner = "dashed-line"
+\property Voice.crescendoSpanner = #'dashed-line
a\mf\< a \!a
a\< \!a
}
\score{
\notes\relative c'''{
\property Voice.TextSpanner \revert #'type
- \property Voice.TextSpanner \override #'type = #"dotted-line"
+ \property Voice.TextSpanner \override #'type = #'dotted-line
\property Voice.TextSpanner \override #'edge-height = #'(0 . 1.5)
\property Voice.TextSpanner \override #'edge-text = #'("8va " . "")
\property Staff.centralCPosition = #-13
a \spanrequest \stop "text"
\property Voice.TextSpanner \revert #'type
- \property Voice.TextSpanner \override #'type = #"dotted-line"
+ \property Voice.TextSpanner \override #'type = #'dotted-line
a \spanrequest \start "text"
b c
a \spanrequest \stop "text"
\property Voice.TextSpanner \revert #'type
- \property Voice.TextSpanner \override #'type = #"dashed-line"
+ \property Voice.TextSpanner \override #'type = #'dashed-line
\property Voice.TextSpanner \override #'edge-height = #'(1 . -2)
a \spanrequest \start "text"
b c
return gh_reverse (removed);
}
-SCM
-ly_last (SCM list)
-{
- return gh_car (scm_last_pair (list));
-}
-
/* tail add */
SCM
ly_snoc (SCM s, SCM list)
Duration *r = (Duration *) gh_cdr (s);
scm_puts ("#<Duration ", port);
- scm_display (gh_str02scm ((char*)r->str().ch_C()), port);
+ scm_display (ly_str02scm (r->str().ch_C()), port);
scm_puts (" >", port);
return 1;
ugh. Use push/pop?
*/
SCM s = get_property ((start_type + "Spanner").ch_C());
- if (!gh_string_p (s) || ly_scm2string (s) == "hairpin")
+ if (!gh_symbol_p (s) || s == ly_symbol2scm ("hairpin"))
{
cresc_p_ = new Spanner (get_property ("Crescendo"));
cresc_p_->set_grob_property ("grow-direction",
warning (_("couldn't find any font satisfying ") );
scm_write (gh_list (name, point_sz, shape, series , family, rel_sz, SCM_UNDEFINED), scm_current_error_port ());
- return gh_str02scm ("cmr10");
+ return ly_str02scm ("cmr10");
}
A ly_B2A (B b);
*/
+
+SCM ly_last (SCM list);
SCM ly_str02scm (char const*c);
SCM ly_deep_copy (SCM);
SCM ly_symbol2scm (char const *);
class Font_metric;
class Font_size_engraver;
class Global_translator;
+class Glissando_req;
class Gourlay_breaking;
class Grace_engraver_group;
class Grace_iterator;
--- /dev/null
+/*
+ line-spanner.hh -- declare Line_spanner
+
+ source file of the GNU LilyPond music typesetter
+
+ (c) 2000 Jan Nieuwenhuizen <janneke@gnu.org>
+*/
+
+
+#ifndef LINE_SPANNER_HH
+#define LINE_SPANNER_HH
+
+#include "lily-guile.hh"
+
+class Line_spanner
+{
+public:
+ DECLARE_SCHEME_CALLBACK (brew_molecule, (SCM));
+ static SCM line_atom (Grob* me, Real dx, Real dy);
+};
+
+#endif /* LINE_SPANNER_HH */
VIRTUAL_COPY_CONS (Music);
};
+class Glissando_req : public Request
+{
+ VIRTUAL_COPY_CONS (Music);
+};
+
#endif // MUSICALREQUESTS_HH
#include "offset.hh"
#include "interval.hh"
+SCM
+ly_last (SCM list)
+{
+ return gh_car (scm_last_pair (list));
+}
+
SCM
ly_str02scm (char const*c)
{
SCM
ly_parse_scm (char const* s, int* n)
{
- SCM str = gh_str02scm ((char*)s);
+ SCM str = ly_str02scm (s);
SCM port = scm_mkstrport (SCM_INUM0, str, SCM_OPN | SCM_RDNG,
"ly_eval_scm_0str");
SCM from = scm_ftell (port);
sprintf (str, "%d ", gh_scm2int (s));
}
- return gh_str02scm (str);
+ return ly_str02scm (str);
}
/*
Global_translator *
Music_output_def::get_global_translator_p ()
{
- Translator_def * t = unsmob_translator_def (find_translator_l (gh_str02scm ("Score")));
+ Translator_def * t = unsmob_translator_def (find_translator_l (ly_str02scm ("Score")));
if (!t)
error (_f ("can't find `%s' context", "Score"));
{"elementdescriptions", ELEMENTDESCRIPTIONS},
{"font", FONT},
{"grace", GRACE},
+ {"glissando", GLISSANDO},
{"header", HEADER},
{"in", IN_T},
{"lyrics", LYRICS},
%token DURATION
%token EXTENDER
%token FONT
+%token GLISSANDO
%token GRACE
%token HEADER
%token HYPHEN
a->set_spot (THIS->here_input ());
$$ = a;
}
+ | GLISSANDO {
+ Glissando_req *g = new Glissando_req;
+ g->set_spot /* No pun intended */ (THIS->here_input ());
+ $$ = g;
+ }
;
sup_quotes:
Pitch *r = (Pitch *) gh_cdr (s);
scm_puts ("#<Pitch ", port);
- scm_display (gh_str02scm ((char*)r->str().ch_C()), port);
+ scm_display (ly_str02scm (r->str().ch_C()), port);
scm_puts (" >", port);
return 1;
#include "molecule.hh"
#include "text-item.hh"
#include "text-spanner.hh"
+#include "line-spanner.hh"
#include "spanner.hh"
#include "font-interface.hh"
#include "dimensions.hh"
Spanner *spanner = dynamic_cast<Spanner*> (me);
Real staff_space = Staff_symbol_referencer::staff_space (me);
- Real thickness = me->paper_l ()->get_var ("stafflinethickness");
-
Drul_array<bool> broken;
Direction d = LEFT;
do
{
Paper_column* s = dynamic_cast<Paper_column*>(spanner->get_bound (d)); // UGH
- broken[d] = (!s->musical_b ());
+ if (s && s->musical_b ())
+ broken[d] = false;
+ else
+ broken[d] = true;
}
while (flip (&d) != LEFT);
-#if 0
- SCM s = me->get_grob_property ("text-style");
-
- String text_style = "italic";
- if (gh_string_p (s))
- text_style = ly_scm2string (s);
-#endif
-
SCM properties = Font_interface::font_alist_chain (me);
SCM edge_text = me->get_grob_property ("edge-text");
width = 0;
}
-
- String type = "dashed-line";
- s = me->get_grob_property ("type");
- if (gh_string_p (s))
- type = ly_scm2string (s);
-
+ /* ugh */
+ Real thick = me->paper_l ()->get_var ("stafflinethickness");
+
Molecule line;
- Drul_array<Molecule> edge_line;
- if (type == "line"
- || type == "dashed-line"
- || type == "dotted-line")
+ SCM list = Line_spanner::line_atom (me, width, 0);
+ if (list != SCM_EOL)
{
- Real thick = thickness;
- s = me->get_grob_property ("line-thickness");
- if (gh_number_p (s))
- thick *= gh_scm2double (s);
-
- // maybe these should be in line-thickness?
- Real length = staff_space;
- s = me->get_grob_property ("dash-length");
- if (gh_number_p (s))
- length = gh_scm2double (s) * staff_space;
-
- Real period = 2 * length + thick;
- s = me->get_grob_property ("dash-period");
- if (gh_number_p (s))
- period = gh_scm2double (s) * staff_space;
- if (type == "dotted-line")
- length = thick;
-
- if (type == "line")
- length = period + thick;
-
- Real on = length - thick;
- Real off = period - on;
-
- SCM list = gh_list (ly_symbol2scm ("dashed-line"),
- gh_double2scm (thick),
- gh_double2scm (on),
- gh_double2scm (off),
- gh_double2scm (width),
- gh_double2scm (0),
- SCM_UNDEFINED);
-
Box b (Interval (0, width), Interval (-thick / 2, thick / 2));
line = Molecule (b, list);
-
- s = me->get_grob_property ("edge-height");
- if (gh_pair_p (s))
+ }
+
+ Drul_array<Molecule> edge_line;
+ s = me->get_grob_property ("edge-height");
+ if (gh_pair_p (s))
+ {
+ Direction d = LEFT;
+ int dir = to_dir (me->get_grob_property ("direction"));
+ do
{
- Direction d = LEFT;
- int dir = to_dir (me->get_grob_property ("direction"));
- do
+ Real dy = gh_scm2double (index_cell (s, d)) * - dir;
+ if (dy)
{
- Real dy = gh_scm2double (index_cell (s, d)) * - dir;
- if (dy)
- {
- SCM list = gh_list (ly_symbol2scm ("dashed-line"),
- gh_double2scm (thick),
- gh_double2scm (on),
- gh_double2scm (off),
- gh_double2scm (0),
- gh_double2scm (dy),
- SCM_UNDEFINED);
-
- Box b (Interval (0, thick),
- dy > 0
- ? Interval (0, dy)
- : Interval (dy, 0));
- edge_line[d] = Molecule (b, list);
- }
+ SCM list = Line_spanner::line_atom (me, 0, dy);
+ Box b (Interval (0, thick),
+ dy > 0
+ ? Interval (0, dy)
+ : Interval (dy, 0));
+ edge_line[d] = Molecule (b, list);
}
- while (flip (&d) != LEFT);
}
+ while (flip (&d) != LEFT);
}
-
+
Molecule m;
if (!edge[LEFT].empty_b ())
m = edge[LEFT];
\type Engraver_group_engraver;
\consists "Thread_devnull_engraver";
\consists "Note_heads_engraver";
+ \consists "Note_head_line_engraver";
\consists "Output_property_engraver";
Generic_property_list = #generic-thread-properties
\consists "Property_engraver";
(define generic-notename-properties
(cons 'note-name-interface
- (list (list 'noteNaemStyle symbol? 'style))))
+ (list (list 'noteNameStyle symbol? 'style))))
(define generic-rest-properties