+1.3.60.jcn1
+===========
+
+* Webpage hacking
+
+1.3.60.hwn1
+===========
+
+* Junk int_identifier, real_identifier. Merged Midi_def_identifier and
+Paper_def_identifier.
+
+* Fixed bug with spanning barlines in combination with Hara-Kiri staffs.
+
+* Cleaned up Text_item, Hyphen_spanner, Lyric_extender and
+Sustain_pedal and reduced them to an Score_element interface (they are
+no longer Score_element derived types).
+
+* Some instances of brew_molecule routines have moved out of
+Score_element, and are now called scheme_molecule.
+
+* Moved lots of parameters from ly/params.ly to ly/engraver.ly
+
1.3.59.hwn1
===========
+
+<! shamefully inspired by Franc,ois Pinard's TP pages >
+
+ </td>
+ </tr>
+</table>
+
<!--
if this file ./Documentation/footer.html.in is present, it is included
--- /dev/null
+
+<! your header here >
+<! shamefully inspired by Franc,ois Pinard's TP pages >
+
+<! ur* can't we generate this with @table from a .texi? >
+
+<bgcolor="grey">
+<table cellpadding=5 width="100%">
+ <tr>
+ <td align=left valign=top width="15%" bgcolor="grey">
+ <table align=left>
+ <tr><td bgcolor="cyan"><b>General info</b></td></tr>
+ <tr><td><font size=-1>
+ <a href="http://www.lilypond.org"><b>Entry page</b></a><br>
+ <a href="http://appel.dyndns.org/lilypond"><b>Hacking</b></a><br>
+ </td></tr>
+ <tr><td bgcolor="cyan"><b>Download Source</b></td></tr>
+ <tr><td><font size=-1>
+ <a href="ftp://ftp.gnu.org/pub/gnu/lilypond"><b>Stable</b></a><br>
+ <a href="ftp://cs.uu.nl/pub/gnu/LilyPond/development"><b>Development</b></a><br>
+ </td></tr>
+ </table>
+ <! /tr >
+ <td align=left valign=top width="90%">
+
+
@mudelafile{breathing-sign.ly}
+Hara kiri staffs kill themselves if they are empty. This example really
+contains two staffs, but the second contains only spaces, and is
+therefore removed.
+
+@mudelafile{hara-kiri-short.ly}
+
+
Fonts are available in a default set of sizes: 11, 13, 16, 20, 23 and
26pt staffheight. Sizes of the text fonts and symbol fonts are made
to match the staff dimensions.
@quotation
@mudela[fragment,verbatim]
- \relative c'' { \key es; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 }
+ \relative c'' { \key c \minor; r8 [c16 b] [c8 g] [as c16 b] [c8 d] | g,4 }
@end mudela
@end quotation
@uref{http://www.gnu.org/,GNU Project}.
The version numbers are in Linux-kernel style: even numbered versions
-are `stable'. The webpages for the stable version (1.2) reside at GNU,
-here: @uref{http://www.gnu.org/software/lilypond}. Big enhancements go
-into the latest odd numbered version (1.3), whose webpages are on
- @uref{http://www.cs.uu.nl/~hanwen/lilypond/,Han-Wen's site}.
+are `stable'. The webpages for the stable version (1.2) reside
+@uref{http://www.gnu.org/software/lilypond, on the GNU servers}. Big
+enhancements go into the latest odd numbered version (1.3), whose
+webpages are on @uref{http://www.cs.uu.nl/~hanwen/lilypond/,Han-Wen's
+site}. Information on the latest and greatest features can be found in
+the @uref{Documentation/out-www/CHANGES.txt, Change Log}.
If want more information, you can browse the
@uref{Documentation/user/out-www/lilypond.html, manual} or other
@uref{Documentation/out-www/index.html, documentation}.
-@unnumberedsec News
-
-For the latest and greatest features, check out the
-@uref{Documentation/out-www/CHANGES.txt, Change Log}.
-
@html
<a name="music">
If you want to compile LilyPond from source, download here:
@itemize @bullet
@item Download stable releases at
-@uref{ftp://ftp.gnu.org/gnu/lilypond/}
-@item Download development releases at
-@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/development/}
-@item Canadian mirror @uref{http://sca.uwaterloo.ca/lilypond/} and @uref{ftp://sca.uwaterloo.ca/pub/}
-@item Another site in Europe
-@uref{ftp://ftp.lilypond.org/pub/LilyPond/}
+@uref{ftp://ftp.gnu.org/gnu/lilypond/,GNU}
+@item Download development releases from
+@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/development/,the source}
+@item @uref{http://sca.uwaterloo.ca/lilypond/, by http (Canadian
+mirror)} and
+@uref{ftp://sca.uwaterloo.ca/pub/, ftp (Canadian mirror)}
+@item
+@uref{ftp://ftp.lilypond.org/pub/LilyPond/,mirror (Europe)}
@end itemize
Installing and compiling requires many additional packages, which are
Binaries are available, but are not updated for every version released.
@itemize @bullet
-@item RedHat-i386 and Linuxppc RPMs:
-@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/RedHat/RPMS/}
-@item Debian binary @uref{ftp://ftp.debian.org/pub/debian/dists/unstable/main/binary-i386/tex}
-@item Windows NT: @uref{http://home.austin.rr.com/jbr/jeff/lilypond/}
+@item
+@uref{ftp://ftp.cs.uu.nl/pub/GNU/LilyPond/RedHat/RPMS/,RedHat-i386 and Linuxppc RPMs:}
+@item
+@uref{ftp://ftp.debian.org/pub/debian/dists/unstable/main/binary-i386/tex,
+ Debian binary}
+@item @uref{http://home.austin.rr.com/jbr/jeff/lilypond/,Windows NT}
@end itemize
Frequently Asked Questions} first.)
-@table @samp
-@item info-gnu-music@@gnu.org
+@itemize @bullet
+@item @samp{info-gnu-music@@gnu.org} (@uref{http://www.mail-archive.com/info-gnu-music@@gnu.org,archive})
is a moderated list for information on the GNU Music project, to
subscribe: send mail with subject "subscribe" to
info-gnu-music-request@@gnu.org.
-
This list is moderated; ask
@email{drl@@gnu.org, David R. Linn} or
@email{hanwen@@cs.uu.nl, Han-Wen} to send announcements for this
list.
- This list is archived at
- @uref{http://www.mail-archive.com/info-gnu-music@@gnu.org}
-@item help-gnu-music@@gnu.org
+@item @samp{help-gnu-music@@gnu.org} (@uref{http://www.mail-archive.com/help-gnu-music@@gnu.org,archive}).
For help with LilyPond music project. To subscribe: send
mail with subject "subscribe" to
- @email{help-gnu-music-request@@gnu.org} The archive is at
- @uref{http://www.mail-archive.com/help-gnu-music@@gnu.org}.
+ @email{help-gnu-music-request@@gnu.org}
-@item bug-gnu-music@@gnu.org
+@item @samp{bug-gnu-music@@gnu.org} (@uref{http://www.mail-archive.com/bug-gnu-music@@gnu.org,archive})
If you have bugreports, you should send them to this list. If you
want to know about bugs, subscribe: send mail with subject "subscribe"
-to @email{bug-gnu-music-request@@gnu.org}. The archive is at
-@uref{http://www.mail-archive.com/bug-gnu-music@@gnu.org}
+to @email{bug-gnu-music-request@@gnu.org}.
+
Please include in your bugreport the version of LilyPond that
you experience the problem with, a description of your system and sample
they tend to be very big and don't help with describing the problem.
-@item gnu-music-discuss@@gnu.org,
+@item @samp{gnu-music-discuss@@gnu.org} (@uref{http://www.mail-archive.com/gnu-music-discuss@@gnu.org,archive})
For discussions concerning LilyPond, to subscribe: send
mail with subject "subscribe" to
- @email{gnu-music-discuss-request@@gnu.org}
- The archive is at
- @uref{http://www.mail-archive.com/gnu-music-discuss@@gnu.org}
-@end table
+ @email{gnu-music-discuss-request@@gnu.org}.
+
+
+@end itemize
If you want to unsubscribe use the same procedure as subscribing, but
substitute @code{unsubscribe} where you would put @code{subscribe}.
@unnumberedsubsec Webmaster's Disclaimer
-These pages were entirely created from a @strong{development snapshots}
+These pages were entirely created from a @strong{development snapshot}
of the LilyPond package. The version of this webpage is printed at the
bottom.
--- /dev/null
+
+\version "1.3.59";
+zager = \context Staff = zager \notes \relative c'' {
+ \clef treble;
+ c1
+}
+
+zoger = \context Staff = zoger \notes \relative c'' {
+ \clef treble;
+ \skip 1* 1;
+}
+
+zagers = \context GrandStaff <
+ \zager
+ \zoger
+>
+
+\score{
+ <
+ \context StaffGroup = zagers <
+ \zagers
+ >
+ >
+ \paper{
+ linewidth = 80.0\mm;
+
+ \translator { \HaraKiriStaffContext }
+%uh?
+
+ }
+}
+
+
%}
+\version "1.3.59";
praeludiumRight = \notes {
- \key e;
+ \key e \major;
\clef violin;
% 13 -- how to type -- where to split -- this more neatly?
}
praeludiumLeft = \notes \relative c {
- \key e;
+ \key e \major;
\clef bass;
% 13
fugaIIRight = \notes \relative c'' {
- \key e; % E-major
+ \key e \major; % E-major
\clef violin;
\time3/4;
gracetest = \notes \grace { [c16 ( cis dis] }
fugaIILeft = \notes {
- \key e;
+ \key e \major;
\clef bass;
%15
}
fugaIIPedal = \notes \relative c {
- \key e;
+ \key e \major;
\clef bass;
%15
\property Staff.instr = #"bs"
\time 4/4;
- \key e;
+ \key e \major;
\clef bass;
%13
/*
second guess: property generic time exception
*/
- SCM begin = get_property (time_str + "beamAutoBegin");
+ SCM begin = get_property ((time_str + "beamAutoBegin").ch_C());
if (unsmob_moment (begin))
begin_mom = * unsmob_moment (begin);
- SCM end = get_property (time_str + "beamAutoEnd");
+ SCM end = get_property ((time_str + "beamAutoEnd").ch_C());
if (unsmob_moment (end))
end_mom = * unsmob_moment (end);
*/
if (type_str.length_i ())
{
- SCM end_mult = get_property ( time_str + "beamAutoEnd" + type_str);
+ SCM end_mult = get_property ((time_str + "beamAutoEnd" + type_str).ch_C());
if (unsmob_moment (end_mult))
end_mom = * unsmob_moment (end_mult);
- SCM begin_mult = get_property (time_str + "beamAutoBegin" + type_str);
+ SCM begin_mult = get_property ((time_str + "beamAutoBegin" + type_str).ch_C());
if (unsmob_moment (begin_mult))
begin_mom = * unsmob_moment (begin_mult);
}
*/
if (type_str.length_i ())
{
- SCM end_mult = get_property (String ("beamAutoEnd") + type_str);
+ SCM end_mult = get_property ((String ("beamAutoEnd") + type_str).ch_C());
if (unsmob_moment (end_mult))
end_mom = * unsmob_moment (end_mult);
- SCM begin_mult = get_property (String ("beamAutoBegin") + type_str);
+ SCM begin_mult = get_property ((String ("beamAutoBegin") + type_str).ch_C());
if (unsmob_moment (begin_mult))
begin_mom = * unsmob_moment (begin_mult);
}
Axis_group_engraver::do_removal_processing ()
{
String type = daddy_grav_l ()->type_str_ ;
- SCM dims = get_property (type + "VerticalExtent");
+ SCM dims = get_property ((type + "VerticalExtent").ch_C());
if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
&& gh_number_p (gh_cdr (dims)))
staffline_p_->set_elt_property ("extent-Y", dims);
}
- dims = get_property (type + "MinimumVerticalExtent");
+ dims = get_property ((type + "MinimumVerticalExtent").ch_C());
if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
&& gh_number_p (gh_cdr (dims)))
staffline_p_->set_elt_property ("minimum-extent-Y", dims);
- dims = get_property (type + "ExtraVerticalExtent");
+ dims = get_property ((type + "ExtraVerticalExtent").ch_C());
if (gh_pair_p (dims) && gh_number_p (gh_car (dims))
&& gh_number_p (gh_cdr (dims)))
staffline_p_->set_elt_property ("extra-extent-Y", dims);
{
if (!bar_p_)
{
- bar_p_ = new Staff_bar (get_property ("basicBarlineProperties"));
+ bar_p_ = new Staff_bar (get_property ("basicBarProperties"));
// urg: "" != empty...
#include "paper-def.hh"
#include "side-position-interface.hh"
#include "staff-symbol.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "moment.hh"
#include "engraver.hh"
#include "protected-scm.hh"
class Bar_number_engraver : public Engraver
{
protected:
- Text_item* text_p_;
+ Item* text_p_;
Protected_scm staffs_;
return;
SCM b = get_property ("basicBarNumberProperties");
- text_p_ = new Text_item (b);
+ text_p_ = new Item (b);
Side_position_interface staffside(text_p_);
staffside.set_axis (Y_AXIS);
}
-Molecule
-Bar::do_brew_molecule () const
+SCM
+Bar::scheme_molecule (SCM smob)
{
- SCM s = get_elt_property ("glyph");
+ Score_element * self = unsmob_element (smob);
+ Bar * fly = dynamic_cast<Bar*> (self);
+ SCM s = self->get_elt_property ("glyph");
if (gh_string_p (s))
{
String str =ly_scm2string (s);
- return compound_barline (str, get_bar_size ());
+ return fly->compound_barline (str, fly->get_bar_size ()).create_scheme ();
}
- return Molecule ();
+ return SCM_EOL;
}
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Bar);
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Bar);
Molecule
Bar::compound_barline (String str, Real h) const
{
- Real kern = paper_l()->get_var ("bar_kern");
- Real thinkern = paper_l()->get_var ("bar_thinkern");
+ Real kern = gh_scm2double (get_elt_property ("kern"));
+ Real thinkern = gh_scm2double (get_elt_property ("thin-kern"));
+ Real hair = gh_scm2double (get_elt_property ("hair-thickness"));
+ Real fatline = gh_scm2double (get_elt_property ("thick-thickness"));
- Molecule thin = simple_barline (paper_l()->get_var ("barthick_thin"), h);
- Molecule thick = simple_barline (paper_l()->get_var ("barthick_thick"), h);
+ Real staffline = paper_l ()->get_var ("stafflinethickness");
+
+ kern *= staffline;
+ thinkern *= staffline;
+ hair *= staffline;
+ fatline *= staffline;
+
+ Molecule thin = simple_barline (hair, h);
+ Molecule thick = simple_barline (fatline, h);
Molecule colon = lookup_l ()->afm_find ("dots-repeatcolon");
Molecule m;
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Breathing_sign);
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Breathing_sign);
-Molecule
-Breathing_sign::do_brew_molecule () const
+SCM
+Breathing_sign::scheme_molecule (SCM smob)
{
- Staff_symbol_referencer_interface si (this);
+ Score_element * sc = unsmob_element (smob);
+ Staff_symbol_referencer_interface si (sc);
Real space = si.staff_space();
Interval i1(0, space / 6), i2(-space / 2, space / 2);
Box b(i1, i2);
- return lookup_l()->filledbox(b);
+ return sc->lookup_l()->filledbox(b).create_scheme ();
}
void
#include "paper-def.hh"
#include "main.hh"
#include "dimensions.hh"
-#include "text-item.hh"
+#include "item.hh"
ADD_THIS_TRANSLATOR (Chord_name_engraver);
return mol;
}
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Chord_name);
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Chord_name);
-Molecule
-Chord_name::do_brew_molecule () const
+SCM
+Chord_name::scheme_molecule (SCM smob)
{
- SCM style = get_elt_property ("style");
+ Score_element *sc = unsmob_element (smob);
+ SCM style = sc->get_elt_property ("style");
if (style == SCM_UNDEFINED)
style = ly_str02scm ("banter");
- SCM inversion = get_elt_property ("inversion");
+ SCM inversion = sc-> get_elt_property ("inversion");
if (inversion == SCM_UNDEFINED)
inversion = SCM_BOOL_F;
- SCM bass = get_elt_property ("bass");
+ SCM bass = sc->get_elt_property ("bass");
if (bass == SCM_UNDEFINED)
bass = SCM_BOOL_F;
- SCM pitches = get_elt_property ("pitches");
+ SCM pitches = sc->get_elt_property ("pitches");
SCM text = scm_eval (gh_list (ly_symbol2scm ("chord::user-name"),
style,
ly_quote_scm (gh_cons (inversion, bass)),
SCM_UNDEFINED));
- return ly_text2molecule (text);
+ return dynamic_cast<Chord_name*> (sc)->
+ ly_text2molecule (text).create_scheme ();
}
Chord_name::Chord_name (SCM s)
#include "engraver.hh"
#include "direction.hh"
#include "side-position-interface.hh"
-#include "text-item.hh"
+#include "item.hh"
/// where is c-0 in the staff?
class Clef_engraver : public Engraver {
Clef_item * clef_p_;
- Text_item * octavate_p_;
+ Item * octavate_p_;
Clef_change_req * clef_req_l_;
void create_clef();
si.set_position (clef_position_i_);
if (octave_dir_)
{
- Text_item * g = new Text_item (get_property ("basicOctavateEightProperties"));
+ Item * g = new Item (get_property ("basicOctavateEightProperties"));
Side_position_interface spi (g);
spi.set_axis (Y_AXIS);
spi.add_support (clef_p_);
#include "clef-item.hh"
#include "string.hh"
#include "molecule.hh"
-#include "text-item.hh"
+#include "item.hh"
Clef_item::Clef_item (SCM s)
: Item (s)
return;
}
- // ugh.
+ // ugh.
+ /* why not suicide? */
if (style == "transparent") // UGH. JUNKME
{
set_elt_property ("molecule-callback", SCM_BOOL_T);
Dots::Dots (SCM s)
: Item (s)
{
- set_elt_property ("dot-count", gh_int2scm (0));
}
void
}
}
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Dots);
-Molecule
-Dots::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Dots);
+
+SCM
+Dots::scheme_molecule (SCM d)
{
- Molecule mol (lookup_l ()->blank (Box (Interval (0,0),
+ Score_element *sc = unsmob_element (d);
+ Molecule mol (sc->lookup_l ()->blank (Box (Interval (0,0),
Interval (0,0))));
- SCM c = get_elt_property ("dot-count");
+ SCM c = sc->get_elt_property ("dot-count");
if (gh_number_p (c))
{
- Molecule d = lookup_l ()->afm_find (String ("dots-dot"));
+ Molecule d = sc->lookup_l ()->afm_find (String ("dots-dot"));
Real dw = d.extent (X_AXIS).length ();
d.translate_axis (-dw, X_AXIS);
mol.add_molecule (d);
}
}
- return mol;
+ return mol.create_scheme ();
}
#include "paper-column.hh"
#include "staff-symbol.hh"
#include "note-column.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "side-position-interface.hh"
#include "engraver.hh"
#include "stem.hh"
*/
class Dynamic_engraver : public Engraver
{
- Text_item * text_p_;
+ Item * text_p_;
Crescendo * finished_cresc_p_;
Crescendo * cresc_p_;
{
String loud = text_req_l_->text_str_;
- text_p_ = new Text_item (get_property ("basicDynamicTextProperties"));
+ text_p_ = new Item (get_property ("basicDynamicTextProperties"));
text_p_->set_elt_property ("text", ly_str02scm (loud.ch_C ()));
if (Direction d=text_req_l_->get_direction ())
directional_element (text_p_).set (d);
gh_int2scm ((span_req_l_drul_[START]->span_type_str_ == "crescendo")
? BIGGER : SMALLER));
- SCM s = get_property (span_req_l_drul_[START]->span_type_str_ + "Text");
+ SCM s = get_property ((span_req_l_drul_[START]->span_type_str_ + "Text").ch_C());
if (gh_string_p (s))
{
cresc_p_->set_elt_property ("start-text", s);
+ "Text", SCM_UNDEFINED);
}
- s = get_property (span_req_l_drul_[START]->span_type_str_ + "Spanner");
+ s = get_property ((span_req_l_drul_[START]->span_type_str_ + "Spanner").ch_C());
/*
#include "musical-request.hh"
#include "extender-spanner.hh"
#include "paper-column.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "engraver.hh"
#include "drul-array.hh"
#include "extender-spanner.hh"
typesets a nice centred extender of varying length depending on the
gap between syllables.
- We remember the last Text_item that come across. When we get a
+ We remember the last Item that come across. When we get a
request, we create the spanner, and attach the left point to the
last lyrics, and the right point to any lyrics we receive by
then. */
class Extender_engraver : public Engraver
{
- Text_item * last_lyric_l_;
- Text_item * current_lyric_l_;
+ Item * last_lyric_l_;
+ Item * current_lyric_l_;
Extender_req* req_l_;
- Lyric_extender* extender_spanner_p_;
+ Spanner* extender_p_;
public:
Extender_engraver ();
VIRTUAL_COPY_CONS (Translator);
{
current_lyric_l_ = 0;
last_lyric_l_ = 0;
- extender_spanner_p_ = 0;
+ extender_p_ = 0;
req_l_ = 0;
}
void
Extender_engraver::acknowledge_element (Score_element_info i)
{
- if (Text_item* t = dynamic_cast<Text_item*> (i.elem_l_))
+ // -> text_item
+ if (Item* t = dynamic_cast<Item*> (i.elem_l_))
{
current_lyric_l_ = t;
- if (extender_spanner_p_
- && !extender_spanner_p_->get_bound (RIGHT)
+ if (extender_p_
+ && !extender_p_->get_bound (RIGHT)
)
{
- extender_spanner_p_->set_textitem (RIGHT, t);
+ Lyric_extender(extender_p_).set_textitem (RIGHT, t);
}
}
}
void
Extender_engraver::do_removal_processing ()
{
- if (extender_spanner_p_)
+ if (extender_p_)
{
req_l_->warning (_ ("unterminated extender"));
- extender_spanner_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
+ extender_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
}
}
return;
}
- extender_spanner_p_ = new Lyric_extender (get_property ("basicLyricExtenderProperties"));
- extender_spanner_p_->set_textitem (LEFT, last_lyric_l_);
- announce_element (Score_element_info (extender_spanner_p_, req_l_));
+ extender_p_ = new Spanner (get_property ("basicLyricExtenderProperties"));
+ extender_p_->set_extent_callback (Score_element::point_dimension_callback, Y_AXIS);
+
+ Lyric_extender (extender_p_).set_textitem (LEFT, last_lyric_l_);
+ announce_element (Score_element_info (extender_p_, req_l_));
}
}
void
Extender_engraver::do_pre_move_processing ()
{
- if (extender_spanner_p_)
+ if (extender_p_)
{
- typeset_element (extender_spanner_p_);
- extender_spanner_p_ = 0;
+ typeset_element (extender_p_);
+ extender_p_ = 0;
}
if (current_lyric_l_)
Hara_kiri_engraver::acknowledge_element (Score_element_info i)
{
Axis_group_engraver::acknowledge_element (i);
+
+ i.elem_l_->add_offset_callback (Hara_kiri_group_spanner::force_hara_kiri_callback, Y_AXIS);
+
if (Rhythmic_head *h = dynamic_cast<Rhythmic_head *> (i.elem_l_))
{
dynamic_cast<Hara_kiri_group_spanner*> (staffline_p_)
#include "debug.hh"
#include "item.hh"
+/*
+ */
Hara_kiri_group_spanner::Hara_kiri_group_spanner(SCM s)
: Spanner (s)
{
{
add_dependency (n);
Pointer_group_interface (this, "items-worth-living").add_element (n);
+
}
void
Hara_kiri_group_spanner::after_line_breaking ()
{
SCM worth = get_elt_pointer ("items-worth-living");
+ /*
+ worth == self_scm is a stupid way to signal that we're done.
+ */
if (gh_pair_p (worth))
return;
programming_error ("Killing other children too");
s->suicide ();
}
- set_extent_callback (0, X_AXIS);
- set_extent_callback (0, Y_AXIS);
+
+ /*
+ very appropriate name here :-)
+ */
+ suicide ();
}
+/*
+ We can't rely on offsets and dimensions of elements in a hara-kiri
+ group. Use a callback to make sure that hara-kiri has been done
+ before asking for offsets. */
+Real
+Hara_kiri_group_spanner::force_hara_kiri_callback (Score_element const *elt, Axis a)
+{
+ while (elt && !dynamic_cast<Hara_kiri_group_spanner const*> (elt))
+ elt = elt->parent_l(a);
+
+ if (elt)
+ {
+ Hara_kiri_group_spanner const * seppuku = dynamic_cast<Hara_kiri_group_spanner const*> (elt);
+
+ ((Hara_kiri_group_spanner*)seppuku)->after_line_breaking ();
+ }
+
+ return 0.0;
+}
#include "proto.hh"
#include "musical-request.hh"
-#include "hyphen-engraver.hh"
#include "hyphen-spanner.hh"
#include "paper-column.hh"
-#include "text-item.hh"
+#include "item.hh"
+#include "engraver.hh"
+
+/**
+ Generate an centred hyphen. Should make a Hyphen_spanner that
+ typesets a nice centred hyphen of varying length depending on the
+ gap between syllables.
+
+ We remember the last Item that come across. When we get a
+ request, we create the spanner, and attach the left point to the
+ last lyrics, and the right point to any lyrics we receive by
+ then. */
+class Hyphen_engraver : public Engraver
+{
+ Item *last_lyric_l_;
+ Item *current_lyric_l_;
+ Hyphen_req* req_l_;
+ Spanner* hyphen_p_;
+public:
+ Hyphen_engraver ();
+ VIRTUAL_COPY_CONS (Translator);
+
+protected:
+ virtual void acknowledge_element (Score_element_info);
+ virtual void do_removal_processing();
+ virtual void do_process_music();
+ virtual bool do_try_music (Music*);
+ virtual void do_pre_move_processing();
+ virtual void do_post_move_processing ();
+private:
+
+};
ADD_THIS_TRANSLATOR (Hyphen_engraver);
{
current_lyric_l_ = 0;
last_lyric_l_ = 0;
- hyphen_spanner_p_ = 0;
+ hyphen_p_ = 0;
req_l_ = 0;
}
void
Hyphen_engraver::acknowledge_element (Score_element_info i)
{
- if (Text_item* t = dynamic_cast<Text_item*> (i.elem_l_))
+
+ // -> text-item
+ if (Item* t = dynamic_cast<Item*> (i.elem_l_))
{
current_lyric_l_ = t;
- if (hyphen_spanner_p_
- && !hyphen_spanner_p_->get_bound (RIGHT)
+ if (hyphen_p_
+ && !hyphen_p_->get_bound (RIGHT)
)
{
- hyphen_spanner_p_->set_textitem (RIGHT, t);
+ Hyphen_spanner (hyphen_p_).set_textitem (RIGHT, t);
}
}
}
void
Hyphen_engraver::do_removal_processing ()
{
- if (hyphen_spanner_p_)
+ if (hyphen_p_)
{
req_l_->warning (_ ("unterminated hyphen"));
- hyphen_spanner_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
+ hyphen_p_->set_bound(RIGHT, get_staff_info ().command_pcol_l ());
}
}
return;
}
- hyphen_spanner_p_ = new Hyphen_spanner (get_property ("basicHyphenSpannerProperties"));
- hyphen_spanner_p_->set_textitem (LEFT, last_lyric_l_);
- announce_element (Score_element_info (hyphen_spanner_p_, req_l_));
+ hyphen_p_ = new Spanner (get_property ("basicHyphenSpannerProperties"));
+ hyphen_p_->set_extent_callback (Score_element::point_dimension_callback,Y_AXIS);
+ Hyphen_spanner (hyphen_p_).set_textitem (LEFT, last_lyric_l_);
+ announce_element (Score_element_info (hyphen_p_, req_l_));
}
}
void
Hyphen_engraver::do_pre_move_processing ()
{
- if (hyphen_spanner_p_)
+ if (hyphen_p_)
{
- typeset_element (hyphen_spanner_p_);
- hyphen_spanner_p_ = 0;
+ typeset_element (hyphen_p_);
+ hyphen_p_ = 0;
}
if (current_lyric_l_)
(adapted from extender-spanner)
*/
-/*
- TODO: too complicated implementation. Why the dx_drul?.
- */
-
#include <math.h>
+
#include "box.hh"
-#include "debug.hh"
#include "lookup.hh"
#include "molecule.hh"
-#include "paper-column.hh"
#include "paper-def.hh"
#include "hyphen-spanner.hh"
-#include "dimension-cache.hh"
+#include "spanner.hh"
+#include "item.hh"
-Hyphen_spanner::Hyphen_spanner (SCM s)
- : Spanner (s)
-{
- dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Hyphen_spanner)
- set_extent_callback (Score_element::point_dimension_callback,Y_AXIS);
-}
-
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Hyphen_spanner)
-Molecule
-Hyphen_spanner::do_brew_molecule () const
+SCM
+Hyphen_spanner::scheme_molecule (SCM smob)
{
+ Spanner * sp =dynamic_cast<Spanner*> (unsmob_element (smob));
Molecule mol;
- Real w = spanner_length ();
+ Real leftext = sp->get_bound (LEFT)->extent (X_AXIS).length ();
- w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+ Real ss = sp->paper_l ()->get_var ("staffspace");
+ Real lt = sp->paper_l ()->get_var ("stafflinethickness");
+ Real th = gh_scm2double (sp->get_elt_property ("thickness")) * lt ;
+ Real h = gh_scm2double (sp->get_elt_property ("height")) * ss;
+ Real l = gh_scm2double (sp->get_elt_property ("minimum-length")) * ss;
+ Real w = sp->spanner_length () - leftext - ss/2;
- Real th = paper_l ()->get_var ("hyphen_thickness");
- Real h = paper_l ()->get_var ("hyphen_height");
- // UGH. First try: just make the hyphen take 1/3 of the available space
- // for length, use a geometric mean of the available space and some minimum
- Real l = paper_l ()->get_var ("hyphen_minimum_length");
+ /* First try: just make the hyphen take 1/3 of the available space
+ for length, use a geometric mean of the available space and some minimum
+ */
if(l < w)
l = sqrt(l*w);
- Molecule a = lookup_l ()->filledbox ( Box (Interval ((w-l)/2,(w+l)/2), Interval (h,h+th)));
- a.translate (Offset (dx_f_drul_[LEFT], 0));
-
- mol.add_molecule (a);
- return mol;
+ Box b (Interval ( (w-l)/2, (w+l)/2), Interval (h,h+th));
+ mol.add_molecule (sp->lookup_l ()->filledbox (b));
+ mol.translate_axis(leftext, X_AXIS);
+ return mol.create_scheme ();
}
-
-
-void
-Hyphen_spanner::after_line_breaking ()
-{
- // UGH
- Real gap = paper_l ()->get_var ("interline");
-
- Direction d = LEFT;
- do
- {
- Item* t = get_bound (d)
- ? get_bound (d) : get_bound ((Direction)-d);
- if (d == LEFT)
- dx_f_drul_[d] += t->extent (X_AXIS).length ();
- else
- dx_f_drul_[d] -= d * gap / 2;
- }
- while (flip(&d) != LEFT);
-}
-
void
Hyphen_spanner::set_textitem (Direction d, Item* textitem_l)
{
- set_bound (d, textitem_l);
- add_dependency (textitem_l);
+ elt_l_->set_bound (d, textitem_l);
+ elt_l_->add_dependency (textitem_l);
}
-
+Hyphen_spanner::Hyphen_spanner (Spanner*s)
+{
+ elt_l_ = s;
+}
JUNKTHIS!
*/
#include <assert.h>
-
-#include "midi-def.hh"
-#include "paper-def.hh"
+#include "music-output-def.hh"
#include "score.hh"
#include "identifier.hh"
#include "my-lily-lexer.hh"
DEFAULT_PRINT(Music);
DEFAULT_PRINT(Request);
DEFAULT_PRINT(Score);
-DEFAULT_PRINT(Midi_def);
-DEFAULT_PRINT(Paper_def);
+DEFAULT_PRINT(Music_output_def);
/* ugh. */
#define DUMMY_STR(Class) \
DUMMY_STR(Music);
DUMMY_STR(Request);
DUMMY_STR(Score);
-DUMMY_STR(Midi_def);
-DUMMY_STR(Paper_def);
+DUMMY_STR(Music_output_def);
DUMMY_STR(Duration);
#define STRING_PRINT(Class) \
STRING_PRINT(Duration);
-STRING_PRINT(Real);
-STRING_PRINT(int);
#define DEFAULT_STR(Class) \
String \
return to_str (*data_p_);\
}
-DEFAULT_STR(int);
-DEFAULT_STR(Real);
-
/*
IMPLEMENT_ID_CLASS(Duration);
IMPLEMENT_ID_CLASS(Translator_group);
-IMPLEMENT_ID_CLASS(int);
-IMPLEMENT_ID_CLASS(Real);
IMPLEMENT_ID_CLASS(Music);
IMPLEMENT_ID_CLASS(Score);
IMPLEMENT_ID_CLASS(Request);
-IMPLEMENT_ID_CLASS(Midi_def);
-IMPLEMENT_ID_CLASS(Paper_def);
+IMPLEMENT_ID_CLASS(Music_output_def);
VIRTUAL_ACCESSOR(Music);
VIRTUAL_ACCESSOR(Request);
VIRTUAL_ACCESSOR(Translator_group);
+VIRTUAL_ACCESSOR(Music_output_def);
DEFAULT_ACCESSOR(Duration);
-DEFAULT_ACCESSOR(int);
-DEFAULT_ACCESSOR(Real);
DEFAULT_ACCESSOR(Score);
-DEFAULT_ACCESSOR(Midi_def);
-DEFAULT_ACCESSOR(Paper_def);
+
int
Identifier::print_smob (SCM s, SCM p, scm_print_state*)
protected:
virtual void before_line_breaking ();
- Molecule do_brew_molecule () const;
+
virtual Real get_bar_size () const;
};
#endif // BAR_HH
extend beond, lasting the whole duration of the melissima
(as in MUP, urg).
*/
-class Lyric_extender : public Spanner
+class Lyric_extender // interface
{
public:
- Lyric_extender (SCM);
+ Spanner*elt_l_;
+ Lyric_extender (Spanner*);
void set_textitem (Direction, Item*);
- static SCM scheme_molecule (SCM);
-
-
-protected:
- Molecule do_brew_molecule () const;
- void after_line_breaking ();
-
- VIRTUAL_COPY_CONS (Score_element);
-
- Drul_array<Real> dx_f_drul_;
+ static SCM scheme_molecule (SCM);
};
#endif // EXTENDER_SPANNER_HH
class Hara_kiri_group_spanner : public Spanner
{
public:
+ static Real force_hara_kiri_callback (Score_element const* , Axis);
Hara_kiri_group_spanner (SCM);
virtual void after_line_breaking ();
void add_interesting_item (Item* n);
The length of the hyphen line should stretch based on the
size of the gap between syllables.
*/
-class Hyphen_spanner : public Spanner
+struct Hyphen_spanner // interface
{
public:
- Hyphen_spanner (SCM);
+ Spanner* elt_l_;
+ Hyphen_spanner (Spanner*);
void set_textitem (Direction, Item*);
- static SCM scheme_molecule (SCM);
-
-
-protected:
- Molecule do_brew_molecule () const;
- Interval do_height () const;
-
- void after_line_breaking ();
-
- VIRTUAL_COPY_CONS (Score_element);
-
- Drul_array<Real> dx_f_drul_;
+ static SCM scheme_molecule (SCM);
};
#endif // HYPHEN_SPANNER_HH
class Translator_group_identifier;
class Music_identifier;
class Articulation_req_identifier;
-class Midi_def_identifier;
-class Paper_def_identifier;
-class Real_identifier;
-class int_identifier;
+class Output_def_identifier;
class Request_identifier;
class Score_identifier;
class Duration_identifier;
String str () const;
IDACCESSOR(Translator_group)
IDACCESSOR(Music)
- IDACCESSOR(Midi_def)
- IDACCESSOR(Paper_def)
- IDACCESSOR(Real)
+ IDACCESSOR(Music_output_def)
IDACCESSOR(Request)
IDACCESSOR(Score)
- IDACCESSOR(int)
IDACCESSOR(Duration)
VIRTUAL_COPY_CONS(Identifier);
DECLARE_ID_CLASS(Translator_group);
DECLARE_ID_CLASS(Duration);
-DECLARE_ID_CLASS(Real);
DECLARE_ID_CLASS(General_script_def);
DECLARE_ID_CLASS(Music);
-DECLARE_ID_CLASS(int);
DECLARE_ID_CLASS(Score);
DECLARE_ID_CLASS(Request);
-DECLARE_ID_CLASS(Paper_def);
-DECLARE_ID_CLASS(Midi_def);
+DECLARE_ID_CLASS(Music_output_def);
Identifier * unsmob_identifier (SCM);
SCM smobify (Identifier*);
struct Text_def;
struct Text_engraver;
struct Text_gob;
-struct Text_item ;
-struct Text_item;
+struct Item ;
struct Text_req;
struct Text_spanner;
struct Tie;
private:
Lyric_req * req_l_;
- Text_item* text_p_;
+ Item* text_p_;
};
*/
class Midi_def : public Music_output_def {
static int default_count_i_;
- int count_per_minute_i;
+
public:
VIRTUAL_COPY_CONS(Music_output_def);
#ifndef PAPER_DEF_HH
#define PAPER_DEF_HH
-#include <map>
#include "lily-proto.hh"
#include "lily-guile.hh"
public:
virtual ~Paper_def ();
- Array<Interval> shape_int_a_;
/*
JUNKME
*/
Real get_realvar (SCM symbol) const;
Real get_var (String id) const;
-
+ SCM get_scmvar (String id)const;
void reinit ();
Paper_def ();
void set_lookup (int, Lookup*);
Paper_def (Paper_def const&);
+
/** The distance between beams of multiplicity_i
JUNKME
*/
Molecule do_brew_molecule () const;
virtual Array<Offset> get_encompass_offset_arr () const;
Bezier get_curve () const;
+
+ /*
+ JUNKME
+ */
Drul_array<Real> dy_f_drul_;
Drul_array<Real> dx_f_drul_;
Spanner (Spanner const &);
bool broken_b () const;
void do_break ();
+ Real spanner_length () const;
static int compare (Spanner * const &,Spanner * const &);
virtual Array<Rod> get_rods () const;
virtual void do_space_processing ();
virtual void do_break_processing ();
- Real spanner_length () const;
virtual Line_of_score*line_l () const;
};
#endif
{
public:
System_start_delimiter (SCM);
- static SCM scheme_molecule (SCM);
+ static SCM scheme_molecule (SCM);
-VIRTUAL_COPY_CONS (Score_element);
+ VIRTUAL_COPY_CONS (Score_element);
protected:
virtual void after_line_breaking();
- virtual Molecule do_brew_molecule () const;
+
Molecule staff_bracket (Real) const;
Molecule staff_brace (Real) const;
Molecule simple_bar (Real) const;
-/*
- text-item.hh -- declare Text_item
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1998--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-
- */
-
-#ifndef Text_ITEM_HH
-#define Text_ITEM_HH
-
-#include "item.hh"
-
-/**
- Print a text in specified style.
- */
-class Text_item : public Item
-{
-public:
- VIRTUAL_COPY_CONS (Score_element);
- static SCM scheme_molecule (SCM);
-
-Text_item (SCM s);
-protected:
- Molecule do_brew_molecule () const;
-};
-
-#endif /* Text_ITEM_HH */
virtual Array<Offset> get_encompass_offset_arr () const;
Bezier get_curve () const;
+ /*
+ JUNKME
+ */
Drul_array<Real> dy_f_drul_;
Drul_array<Real> dx_f_drul_;
class Translator_group : public virtual Translator {
Array<String> consists_str_arr_;
Array<String> accepts_str_arr_;
- Array<String> consists_end_str_arr_;
+ Array<String> consists_end_str_arr_;
Scheme_hash_table properties_dict_;
int iterator_count_;
*/
Music_output_def *output_def_l () const;
- SCM get_property (String) const;
+ SCM get_property (const char *) const;
SCM get_property (SCM symbol) const;
virtual Moment now_mom () const;
*/
#include "engraver.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "bar.hh"
#include "system-start-delimiter.hh"
#include "side-position-interface.hh"
class Instrument_name_engraver : public Engraver
{
- Text_item *text_;
+ Item *text_;
System_start_delimiter * delim_ ;
void create_text (SCM s);
{
if(!text_)
{
- text_ = new Text_item (get_property ("basicInstrumentNameProperties"));
+ text_ = new Item (get_property ("basicInstrumentNameProperties"));
text_->set_elt_property ("text", txt);
/*
int n = 0;
if (main_input_b_ && safe_global_b) {
error (_ ("Can't evaluate Scheme in safe mode"));
- return SCM_EOL;
+ yylval.scm = SCM_EOL;
+ return SCM_T;
}
yylval.scm = ly_parse_scm (s, &n);
DEBUG_OUT << "Scheme: ";
if (gh_string_p (sid)) {
yylval.scm = sid;
return STRING_IDENTIFIER;
+ } else if (gh_number_p (sid)) {
+ yylval.scm = sid;
+ return NUMBER_IDENTIFIER;
}
+
Identifier * id = unsmob_identifier (sid);
if (id) {
yylval.id = id;
char str[100]; // ugh.
- if (scm_integer_p (s))
+ if (scm_integer_p (s) == SCM_BOOL_F)
{
Real r (gh_scm2double (s));
*/
#include "engraver.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "side-position-interface.hh"
#include "note-head.hh"
#include "stem.hh"
{
if (!text_item_p_ && interesting_.size ())
{
- text_item_p_ = new Text_item (get_property ("basicTextProperties") );
+ text_item_p_ = new Item (get_property ("basicTextProperties") );
Side_position_interface si (text_item_p_);
si.set_axis (Y_AXIS);
text_item_p_->set_parent (interesting_[0].elem_l_, Y_AXIS);
#include "lyric-engraver.hh"
#include "musical-request.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "paper-def.hh"
#include "lookup.hh"
{
if (req_l_)
{
- text_p_= new Text_item (get_property ("basicLyricTextProperties"));
+ text_p_= new Item (get_property ("basicLyricTextProperties"));
text_p_->set_elt_property ("text",
ly_str02scm ((req_l_->text_str_ + " ").ch_C ()));
source file of the GNU LilyPond music typesetter
(c) 1998--2000 Jan Nieuwenhuizen <janneke@gnu.org>
+ Han-Wen Nienhuys
*/
-/*
- TODO: too complicated implementation. Why the dx_drul?.
- */
-
-#
#include "dimension-cache.hh"
#include "box.hh"
#include "debug.hh"
#include "paper-def.hh"
#include "extender-spanner.hh"
-Lyric_extender::Lyric_extender (SCM s)
- : Spanner (s)
-
-{
- dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
- set_extent_callback (Score_element::point_dimension_callback, Y_AXIS);
-}
-
-
-
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Lyric_extender)
-Molecule
-Lyric_extender::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Lyric_extender)
+SCM
+Lyric_extender::scheme_molecule (SCM smob)
{
- Molecule mol;
-
- Real w = spanner_length ();
+ Spanner *sp = dynamic_cast<Spanner*> (unsmob_element (smob));
- w += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
- Real h = paper_l ()->get_var ("extender_height");
- Molecule a = lookup_l ()->filledbox ( Box (Interval (0,w), Interval (0,h)));
- a.translate (Offset (dx_f_drul_[LEFT], 0));
-
- mol.add_molecule (a);
-
- return mol;
+ Real leftext = sp->get_bound (LEFT)->extent (X_AXIS).length ();
+ Real ss = sp->paper_l ()->get_var ("staffspace");
+ Real w = sp->spanner_length () - leftext - ss/2;
+
+ Real h = sp->paper_l ()->get_var ("extender_height");
+ Molecule mol (sp->lookup_l ()->filledbox ( Box (Interval (0,w), Interval (0,h))));
+ mol.translate (Offset (leftext, 0));
+ return mol.create_scheme();
}
-
-
void
-Lyric_extender::after_line_breaking ()
+Lyric_extender::set_textitem (Direction d, Item* textitem_l)
{
- // UGH
- Real gap = paper_l ()->get_var ("interline");
-
- Direction d = LEFT;
- do
- {
- Item* t = get_bound (d)
- ? get_bound (d) : get_bound ((Direction)-d);
- if (d == LEFT)
- dx_f_drul_[d] += t->extent (X_AXIS).length ();
- else
- dx_f_drul_[d] -= d * gap / 2;
- }
- while (flip(&d) != LEFT);
+ elt_l_->set_bound (d, textitem_l);
+ elt_l_->add_dependency (textitem_l);
}
-
-void
-Lyric_extender::set_textitem (Direction d, Item* textitem_l)
+Lyric_extender::Lyric_extender (Spanner*s)
{
- set_bound (d, textitem_l);
- add_dependency (textitem_l);
+ elt_l_ = s;
}
-
#include "side-position-interface.hh"
#include "staff-symbol-referencer.hh"
#include "staff-symbol.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "group-interface.hh"
/**
VIRTUAL_COPY_CONS(Translator);
Mark_engraver ();
protected:
- Text_item* text_p_;
+ Item* text_p_;
Protected_scm staffs_;
protected:
{
/*
Ugh. Figure out how to do this right at beginning of line, (without
- creating class Bar_script : public Text_item).
+ creating class Bar_script : public Item).
*/
text_p_->set_parent (s, X_AXIS);
}
return;
SCM s = get_property ("basicMarkProperties");
- text_p_ = new Text_item (s);
+ text_p_ = new Item (s);
Group_interface (text_p_, "interfaces").add_thing (ly_symbol2scm ("Mark"));
Side_position_interface staffside(text_p_);
#include "score-performer.hh"
#include "debug.hh"
-// classes, alphasorted
-// statics
-// constructors
-// destructor
-// routines, alphasorted
-
Midi_def::Midi_def()
{
// ugh
sd.set_interface ();
note_p->add_dots (d);
- d->set_elt_property ("dot-count", gh_int2scm (note_req_l->duration_.dots_i_));
+
+ if (note_req_l->duration_.dots_i_
+ != gh_scm2int (d->get_elt_property ("dot-count")))
+ d->set_elt_property ("dot-count", gh_int2scm (note_req_l->duration_.dots_i_));
+
announce_element (Score_element_info (d,0));
dot_p_arr_.push (d);
}
#include "engraver.hh"
#include "musical-request.hh"
-#include "text-item.hh"
+#include "item.hh"
class Note_name_engraver : public Engraver
{
public:
VIRTUAL_COPY_CONS(Translator);
Link_array<Note_req> req_l_arr_;
- Link_array<Text_item> texts_;
+ Link_array<Item> texts_;
virtual bool do_try_music (Music*m);
virtual void do_process_music ();
virtual void do_pre_move_processing ();
}
if (s.length_i())
{
- Text_item * t = new Text_item (SCM_EOL);
+ Item * t = new Item (SCM_EOL);
t->set_elt_property ("text", ly_str02scm ( s.ch_C()));
announce_element (Score_element_info (t, req_l_arr_[0]));
texts_.push (t);
Paper_def::Paper_def (Paper_def const&s)
: Music_output_def (s)
{
- shape_int_a_ = s.shape_int_a_;
lookup_p_tab_p_ = new map<int, Lookup*>;
for (map<int,Lookup*>::const_iterator ai = s.lookup_p_tab_p_->begin();
return get_realvar (ly_symbol2scm (s.ch_C()));
}
+SCM
+Paper_def::get_scmvar (String s) const
+{
+ return scope_p_->scm_elem (ly_symbol2scm (s.ch_C()));
+}
+
Real
Paper_def::get_realvar (SCM s) const
{
if (!scope_p_->elem_b (s))
- error (_f ("unknown paper variable: `%s'", ly_symbol2string (s)));
- Real * p = scope_p_->elem (s)->access_content_Real (false);
- if (!p)
{
- error (_("not a real variable"));
+ programming_error ("unknown paper variable: " + ly_symbol2string (s));
+ return 0.0;
+ }
+ SCM val = scope_p_->scm_elem (s);
+ if (gh_number_p (val))
+ {
+ return gh_scm2double (val);
+ }
+ else
+ {
+ non_fatal_error (_("not a real variable"));
return 0.0;
}
-
- return *p;
}
/*
{
output_String_def (prefix + s, ly_scm2string (v));
}
-
- Identifier * id = unsmob_identifier (v);
-
- if(dynamic_cast<Real_identifier*> (id))
+ else if (scm_integer_p (v) == SCM_BOOL_T)
{
- Real val = *id->access_content_Real (false);
-
- output_Real_def (prefix + s, val);
+ output_int_def (prefix + s, gh_scm2int (v));
}
- else if (dynamic_cast<int_identifier*> (id))
+ else if (gh_number_p (v))
{
- int val = *id->access_content_int (false);
-
- output_int_def (prefix + s, val);
+ output_Real_def (prefix + s, gh_scm2double (v));
}
}
}
// mmm JUNKME ?
-Mudela_version oldest_version ("1.3.42");
+Mudela_version oldest_version ("1.3.59");
void
print_mudela_versions (ostream &os)
%union {
Array<Musical_pitch> *pitch_arr;
Link_array<Request> *reqvec;
- Array<int> *intvec;
Duration *duration;
Identifier *id;
String * string;
Musical_pitch * pitch;
Midi_def* midi;
Moment *moment;
- Paper_def *paper;
Real real;
Request * request;
/* We use SCMs to do strings, because it saves us the trouble of
deleting them. Let's hope that a stack overflow doesnt trigger a move
of the parse stack onto the heap. */
+
SCM scm;
Tempo_req *tempo;
%token <id> IDENTIFIER
%token <id> MUSIC_IDENTIFIER
%token <id> REQUEST_IDENTIFIER
-%token <id> REAL_IDENTIFIER
%token <id> TRANS_IDENTIFIER
-%token <id> INT_IDENTIFIER
+%token <scm> NUMBER_IDENTIFIER
+
%token <id> SCORE_IDENTIFIER
-%token <id> MIDI_IDENTIFIER
-%token <id> PAPER_IDENTIFIER
-%token <real> REAL
+%token <id> MUSIC_OUTPUT_DEF_IDENTIFIER
-%token <scm> STRING_IDENTIFIER SCM_IDENTIFIER
+%token <scm> STRING_IDENTIFIER SCM_IDENTIFIER
%token <scm> DURATION RESTNAME
-%token <scm> STRING
+%token <scm> STRING
%token <scm> SCM_T
%token <i> UNSIGNED
-
+%token <real> REAL
%type <outputdef> output_def
%type <scope> mudela_header mudela_header_body
%type <music> simple_element request_chord command_element Simple_music Composite_music
%type <music> Alternative_music Repeated_music
%type <i> tremolo_type
-%type <i> int unsigned
+%type <i> bare_int bare_unsigned
%type <i> script_dir
-%type <scm> identifier_init
+%type <scm> identifier_init
%type <duration> steno_duration optional_notemode_duration
%type <duration> entered_notemode_duration explicit_duration
-%type <intvec> int_list
+
%type <reqvec> pre_requests post_requests
%type <request> gen_text_def
%type <pitch> steno_musical_pitch musical_pitch absolute_musical_pitch
%type <pitch_arr> chord_additions chord_subtractions chord_notes chord_step
%type <music> chord
%type <pitch> chord_note chord_inversion chord_bass
-%type <midi> midi_block midi_body
%type <duration> duration_length
%type <scm> embedded_scm scalar
%type <music> relative_music re_rhythmed_music
%type <music> property_def translator_change
%type <music_list> Music_list
-%type <paper> paper_block paper_def_body
-%type <real> real real_with_dimension
+%type <outputdef> music_output_def_body
%type <request> shorthand_command_req
%type <request> post_request
%type <request> command_req verbose_command_req
%type <request> extender_req
%type <request> hyphen_req
-%type <scm> string
+%type <scm> string bare_number number_expression
%type <score> score_block score_body
%type <trans> translator_spec_block translator_spec_body
| score_block {
score_global_array.push ($1);
}
- | paper_block {
+ | output_def {
Identifier * id = new
- Paper_def_identifier ($1, PAPER_IDENTIFIER);
- THIS->lexer_p_->set_identifier ("$defaultpaper", smobify (id))
- }
- | midi_block {
- Identifier * id = new
- Midi_def_identifier ($1, MIDI_IDENTIFIER);
- THIS->lexer_p_->set_identifier ("$defaultmidi", smobify (id))
+ Music_output_def_identifier ($1, MUSIC_OUTPUT_DEF_IDENTIFIER);
+ if (dynamic_cast<Paper_def*> ($1))
+ THIS->lexer_p_->set_identifier ("$defaultpaper", smobify (id));
+ else if (dynamic_cast<Midi_def*> ($1))
+ THIS->lexer_p_->set_identifier ("$defaultmidi", smobify (id));
}
| embedded_scm {
// junk value
identifier_init:
score_block {
$$ = smobify (new Score_identifier ($1, SCORE_IDENTIFIER));
-
}
- | paper_block {
- $$ = smobify (new Paper_def_identifier ($1, PAPER_IDENTIFIER));
- }
- | midi_block {
- $$ = smobify (new Midi_def_identifier ($1, MIDI_IDENTIFIER));
-
+ | output_def {
+ $$ = smobify (new Music_output_def_identifier ($1, MUSIC_OUTPUT_DEF_IDENTIFIER));
}
| translator_spec_block {
$$ = smobify (new Translator_group_identifier ($1, TRANS_IDENTIFIER));
| explicit_duration {
$$ = smobify (new Duration_identifier ($1, DURATION_IDENTIFIER));
}
- | real {
- $$ = smobify (new Real_identifier (new Real ($1), REAL_IDENTIFIER));
+ | number_expression {
+ $$ = $1;
}
| string {
$$ = $1;
}
- | int {
- $$ = smobify (new int_identifier (new int ($1), INT_IDENTIFIER));
- }
| embedded_scm {
$$ = $1;
}
tg->set_property (ly_scm2string ($2), $4);
}
| translator_spec_body STRING '=' identifier_init semicolon {
- Identifier* id = unsmob_identifier ($4);
-
- Real_identifier *r= dynamic_cast<Real_identifier*>(id);
- int_identifier *i = dynamic_cast<int_identifier*> (id);
-
- SCM v;
- if (gh_string_p ($4))
+ SCM v = gh_int2scm (0);
+ if (gh_string_p ($4) || gh_number_p ($4))
v = $4;
- else if (i) v = gh_int2scm (*i->access_content_int (false));
- else if (r) v = gh_double2scm (*r->access_content_Real (false));
else
THIS->parser_error (_("Wrong type for property value"));
- if (id)
- delete id;
/* ugh*/
Translator_group* tg = dynamic_cast<Translator_group*> ($$);
{
Identifier *id =
unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultpaper"));
- $$->add_output (id ? id->access_content_Paper_def (true) : new Paper_def );
+ $$->add_output (id ? id->access_content_Music_output_def (true) : new Paper_def );
}
}
;
}
;
-output_def:
- paper_block {
- $$ = $1;
- }
- | midi_block {
- $$= $1;
- }
- ;
-
-
-/*
- PAPER
-*/
-paper_block:
- PAPER '{' paper_def_body '}' {
- $$ = $3;
- THIS-> lexer_p_->scope_l_arr_.pop ();
- }
- ;
-
-
-paper_def_body:
- /* empty */ {
- Identifier *id = unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultpaper"));
- Paper_def *p = id ? id->access_content_Paper_def (true) : new Paper_def;
- THIS-> lexer_p_-> scope_l_arr_.push (p->scope_p_);
- $$ = p;
- }
- | PAPER_IDENTIFIER {
- Paper_def *p = $1->access_content_Paper_def (true);
- THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
- $$ = p;
- }
- | paper_def_body int '=' FONT STRING { // ugh, what a syntax
- Lookup * l = new Lookup;
- l->font_name_ = ly_scm2string ($5);
- $$->set_lookup ($2, l);
- }
- | paper_def_body assignment semicolon {
-
- }
- | paper_def_body translator_spec_block {
- $$->assign_translator ($2);
- }
- | paper_def_body error {
-
- }
- ;
-
-
-
-real_with_dimension:
- REAL CM_T {
- $$ = $1 CM;
- }
- | REAL PT_T {
- $$ = $1 PT;
- }
- | REAL IN_T {
- $$ = $1 INCH;
- }
- | REAL MM_T {
- $$ = $1 MM;
- }
- | REAL CHAR_T {
- $$ = $1 CHAR;
- }
- ;
-real:
- REAL {
- $$ = $1;
- }
- | real_with_dimension
- | REAL_IDENTIFIER {
- $$= *$1->access_content_Real (false);
- }
- | '-' real %prec UNARY_MINUS {
- $$ = -$2;
- }
- | real '*' real {
- $$ = $1 * $3;
- }
- | real '/' real {
- $$ = $1 / $3;
- }
- | real '+' real {
- $$ = $1 + $3;
- }
- | real '-' real {
- $$ = $1 - $3;
- }
- | '(' real ')' {
- $$ = $2;
- }
- ;
-
/*
MIDI
*/
-midi_block:
- MIDI
- '{' midi_body '}' {
- $$ = $3;
+output_def:
+ music_output_def_body '}' {
+ $$ = $1;
THIS-> lexer_p_-> scope_l_arr_.pop();
}
;
-midi_body: /* empty */ {
+music_output_def_body:
+ MIDI '{' {
Identifier *id = unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultmidi"));
- Midi_def* p = id
- ? id->access_content_Midi_def (true) : new Midi_def ;
+
+
+ Midi_def* p =0;
+ if (id)
+ p = dynamic_cast<Midi_def*> (id->access_content_Music_output_def (true));
+ else
+ p = new Midi_def;
$$ = p;
THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
}
- | MIDI_IDENTIFIER {
- Midi_def * p =$1-> access_content_Midi_def (true);
+ | PAPER '{' {
+ Identifier *id = unsmob_identifier (THIS->lexer_p_->lookup_identifier ("$defaultpaper"));
+ Paper_def *p = 0;
+ if (id)
+ p = dynamic_cast<Paper_def*> (id->access_content_Music_output_def (true));
+ else
+ p = new Paper_def;
+ THIS-> lexer_p_-> scope_l_arr_.push (p->scope_p_);
+ $$ = p;
+ }
+ | PAPER '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
+ Music_output_def *p = $3->access_content_Music_output_def (true);
+ THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
$$ = p;
+ }
+ | MIDI '{' MUSIC_OUTPUT_DEF_IDENTIFIER {
+ Music_output_def *p = $3->access_content_Music_output_def (true);
THIS->lexer_p_->scope_l_arr_.push (p->scope_p_);
+ $$ = p;
}
- | midi_body assignment semicolon {
+ | music_output_def_body assignment semicolon {
}
- | midi_body translator_spec_block {
+ | music_output_def_body translator_spec_block {
$$-> assign_translator ($2);
}
- | midi_body tempo_request semicolon {
+ | music_output_def_body tempo_request semicolon {
/*
junk this ? there already is tempo stuff in
music.
*/
- $$->set_tempo ($2->dur_.length_mom (), $2->metronome_i_);
+ dynamic_cast<Midi_def*> ($$)->set_tempo ($2->dur_.length_mom (), $2->metronome_i_);
delete $2;
}
- | midi_body error {
+ | music_output_def_body bare_int '=' FONT STRING { // ugh, what a syntax
+ Lookup * l = new Lookup;
+ l->font_name_ = ly_scm2string ($5);
+ dynamic_cast<Paper_def*> ($$)->set_lookup ($2, l);
+ }
+ | music_output_def_body error {
}
;
tempo_request:
- TEMPO steno_duration '=' unsigned {
+ TEMPO steno_duration '=' bare_unsigned {
$$ = new Tempo_req;
$$->dur_ = *$2;
delete $2;
Repeated_music:
- REPEAT STRING unsigned Music Alternative_music
+ REPEAT STRING bare_unsigned Music Alternative_music
{
Music_sequence* m = dynamic_cast <Music_sequence*> ($5);
if (m && $3 < m->length_i ())
| MUSIC_IDENTIFIER { $$ = $1->access_content_Music (true); }
| property_def
| translator_change
- | Simple_music '*' unsigned '/' unsigned {
+ | Simple_music '*' bare_unsigned '/' bare_unsigned {
$$ = $1;
$$->compress (Moment($3, $5 ));
}
- | Simple_music '*' unsigned {
+ | Simple_music '*' bare_unsigned {
$$ = $1;
$$->compress (Moment ($3, 1));
}
THIS->remember_spot ();
}
/* CONTINUED */
- unsigned '/' unsigned Music
+ bare_unsigned '/' bare_unsigned Music
{
$$ = new Time_scaled_music ($3, $5, $6);
scalar:
string { $$ = $1; }
- | int { $$ = gh_int2scm ($1); }
+ | bare_int { $$ = gh_int2scm ($1); }
| embedded_scm { $$ = $1; }
;
BAR STRING {
$$ = new Bar_req (ly_scm2string ($2));
}
- | COMMANDSPANREQUEST int STRING {
+ | COMMANDSPANREQUEST bare_int STRING {
Span_req * sp_p = new Span_req;
sp_p-> span_dir_ = Direction($2);
sp_p->span_type_str_ = ly_scm2string ($3);
$$ = m;
}
- | MARK unsigned {
+ | MARK bare_unsigned {
Mark_req *m = new Mark_req;
m->mark_label_ = gh_int2scm ($2);
$$ = m;
}
- | TIME_T unsigned '/' unsigned {
+ | TIME_T bare_unsigned '/' bare_unsigned {
Time_signature_change_req *m = new Time_signature_change_req;
m->beats_i_ = $2;
m->one_beat_i_=$4;
$$ = m;
}
- | PENALTY int {
+ | PENALTY bare_int {
Break_req * b = new Break_req;
b->penalty_f_ = $2 / 100.0;
b->set_spot (THIS->here_input ());
Key_change_req *key_p= new Key_change_req;
$$ = key_p;
}
-/*
-TODO: Support for minor/major keys; make `major-scale' settable.
-
-FIXME: force modality.
-*/
-/*
- | KEY NOTENAME_PITCH {
- Key_change_req *key_p= new Key_change_req;
-
- key_p->pitch_alist_ = scm_eval (ly_symbol2scm ("major-scale"));
- $$ = key_p;
- }
-*/
| KEY NOTENAME_PITCH SCM_IDENTIFIER {
Key_change_req *key_p= new Key_change_req;
$$ = ts_p;
}
- | SPANREQUEST int STRING {
+ | SPANREQUEST bare_int STRING {
Span_req * sp_p = new Span_req;
- sp_p-> span_dir_ = Direction($2);
+ sp_p->span_dir_ = Direction($2);
sp_p->span_type_str_ = ly_scm2string ($3);
sp_p->set_spot (THIS->here_input ());
$$ = sp_p;
;
explicit_duration:
- DURATION '{' int_list '}' {
+ DURATION embedded_scm {
$$ = new Duration;
- Array<int> &a = *$3;
- ARRAY_SIZE(a,2);
-
- $$-> durlog_i_ = a[0];
- $$-> dots_i_ = a[1];
-
- delete &a;
+ if (scm_ilength ($2) == 2)
+ {
+ $$-> durlog_i_ = gh_scm2int (gh_car($2));
+ $$-> dots_i_ = gh_scm2int (gh_cadr($2));
+ }
+ else
+ THIS->parser_error (_("Must have 2 arguments for duration"));
}
;
steno_duration {
$$ = $1;
}
- | duration_length '*' unsigned {
+ | duration_length '*' bare_unsigned {
$$->tuplet_iso_i_ *= $3;
}
- | duration_length '/' unsigned {
+ | duration_length '/' bare_unsigned {
$$->tuplet_type_i_ *= $3;
}
;
;
steno_duration:
- unsigned {
+ bare_unsigned {
$$ = new Duration;
if (!is_duration_b ($1))
THIS->parser_error (_f ("not a duration: %d", $1));
':' {
$$ =0;
}
- | ':' unsigned {
+ | ':' bare_unsigned {
if (!is_duration_b ($2))
THIS->parser_error (_f ("not a duration: %d", $2));
$$ = $2;
delete $1;
delete $4;
-
}
| RESTNAME optional_notemode_duration {
Simultaneous_music* velt_p = new Request_chord;
| STRING optional_notemode_duration {
if (!THIS->lexer_p_->lyric_state_b ())
THIS->parser_error (_ ("Have to be in Lyric mode for lyrics"));
- Simultaneous_music* velt_p = new Request_chord;
+ Simultaneous_music* velt_p = new Request_chord;
- Lyric_req* lreq_p = new Lyric_req;
- lreq_p ->text_str_ = ly_scm2string ($1);
- lreq_p->duration_ = *$2;
- lreq_p->set_spot (THIS->here_input());
+ Lyric_req* lreq_p = new Lyric_req;
+ lreq_p ->text_str_ = ly_scm2string ($1);
+ lreq_p->duration_ = *$2;
+ lreq_p->set_spot (THIS->here_input());
- velt_p->add_music (lreq_p);
+ velt_p->add_music (lreq_p);
- delete $2;
+ delete $2;
$$= velt_p;
}
}
;
+
chord:
steno_tonic_pitch optional_notemode_duration chord_additions chord_subtractions chord_inversion chord_bass {
$$ = THIS->get_chord (*$1, $3, $4, $5, $6, *$2);
;
chord_note:
- unsigned {
+ bare_unsigned {
$$ = new Musical_pitch;
$$->notename_i_ = ($1 - 1) % 7;
$$->octave_i_ = $1 > 7 ? 1 : 0;
$$->accidental_i_ = 0;
}
- | unsigned '+' {
+ | bare_unsigned '+' {
$$ = new Musical_pitch;
$$->notename_i_ = ($1 - 1) % 7;
$$->octave_i_ = $1 > 7 ? 1 : 0;
$$->accidental_i_ = 1;
}
- | unsigned CHORD_MINUS {
+ | bare_unsigned CHORD_MINUS {
$$ = new Musical_pitch;
$$->notename_i_ = ($1 - 1) % 7;
$$->octave_i_ = $1 > 7 ? 1 : 0;
/*
UTILITIES
*/
-
-/*
- FIXME: use scm.
-*/
-/*
-pitch_list: {
- $$ = new Array<Musical_pitch>;
+number_expression:
+ bare_number {
+ $$ = $1;
}
- | pitch_list musical_pitch {
- $$->push (*$2);
- delete $2;
+ | '-' number_expression %prec UNARY_MINUS {
+ $$ = scm_difference ($2, SCM_UNDEFINED);
}
- ;
-*/
-
-int_list:
- /**/ {
- $$ = new Array<int>
+ | number_expression '*' number_expression {
+ $$ = scm_product ($1, $3);
+ }
+ | number_expression '/' number_expression {
+ $$ = scm_divide ($1, $3);
+ }
+ | number_expression '+' number_expression {
+ $$ = scm_sum ($1, $3);
}
- | int_list int {
- $$->push ($2);
+ | number_expression '-' number_expression {
+ $$ = scm_difference ($1, $3);
+ }
+ | '(' number_expression ')' {
+ $$ = $2;
}
;
-unsigned:
+bare_number:
UNSIGNED {
- $$ = $1;
+ $$ = gh_int2scm ($1);
}
| DIGIT {
+ $$ = gh_int2scm ($1);
+ }
+ | REAL {
+ $$ = gh_double2scm ($1);
+ }
+ | NUMBER_IDENTIFIER {
$$ = $1;
}
+ | REAL CM_T {
+ $$ = gh_double2scm ($1 CM);
+ }
+ | REAL PT_T {
+ $$ = gh_double2scm ($1 PT);
+ }
+ | REAL IN_T {
+ $$ = gh_double2scm ($1 INCH);
+ }
+ | REAL MM_T {
+ $$ = gh_double2scm ($1 MM);
+ }
+ | REAL CHAR_T {
+ $$ = gh_double2scm ($1 CHAR);
+ }
;
-int:
- unsigned {
- $$ = $1;
+
+bare_unsigned:
+ bare_number {
+ if (scm_integer_p ($1) == SCM_BOOL_T) {
+ $$ = gh_scm2int ($1);
+
+ } else {
+ THIS->parser_error (_("need integer number arg"));
+ $$ = 0;
+ }
+ if ($$ < 0) {
+ THIS->parser_error (_("Must be positive integer"));
+ $$ = -$$;
+ }
+
}
- | '-' unsigned {
- $$ = -$2;
+ ;
+bare_int:
+ bare_number {
+ if (scm_integer_p ($1) == SCM_BOOL_T)
+ {
+ int k = gh_scm2int ($1);
+ $$ = k;
+ } else
+ {
+ THIS->parser_error (_("need integer number arg"));
+ $$ = 0;
+ }
}
- | INT_IDENTIFIER {
- $$ = *$1->access_content_int (false);
+ | '-' bare_int {
+ $$ = -$2;
}
;
semicolon:
';'
;
+
%%
void
#include "stem.hh"
#include "side-position-interface.hh"
#include "staff-symbol-referencer.hh"
-#include "text-item.hh"
-#include "sustain-pedal.hh"
+#include "item.hh"
+
/*
TODO:
}
else
{
- s = get_property ("stopStart" + String (p->name_ ));
+ s = get_property (("stopStart" + String (p->name_ )).ch_C());
}
p->start_req_l_ = p->req_l_drul_[START];
}
}
else
{
- s = get_property ("stop" + String (p->name_ ));
+ s = get_property (("stop" + String (p->name_ )).ch_C());
}
p->start_req_l_ = 0;
}
else if (p->req_l_drul_[START])
{
p->start_req_l_ = p->req_l_drul_[START];
- s = get_property ("start" + String (p->name_ ));
+ s = get_property (("start" + String (p->name_ )).ch_C());
}
if (gh_string_p (s))
if (p->name_ == String ("Sustain"))
{
// fixme: Item should be sufficient.
- p->item_p_ = new Text_item (get_property ("basicSustainPedalProperties"));
+ p->item_p_ = new Item (get_property ("basicSustainPedalProperties"));
}
else
{
- p->item_p_ = new Text_item (get_property ("basicPedalProperties"));
+ p->item_p_ = new Item (get_property ("basicPedalProperties"));
}
- p->item_p_->set_elt_property ("text", s);
- // guh
+ p->item_p_->set_elt_property ("text", s);
+ // guh
Side_position_interface si (p->item_p_);
si.set_axis (Y_AXIS);
#include "paper-score.hh"
#include "staff-symbol-referencer.hh"
-
+// -> offset callback
void
Rest::after_line_breaking ()
{
}
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Rest)
-Molecule
-Rest::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Rest)
+
+SCM
+Rest::scheme_molecule (SCM smob)
{
+ Score_element* sc = unsmob_element (smob);
+
bool ledger_b =false;
- if (balltype_i () == 0 || balltype_i () == 1)
+ SCM balltype = sc->get_elt_property ("duration-log");
+
+ if (balltype == gh_int2scm (0) || balltype == gh_int2scm (1))
{
- Staff_symbol_referencer_interface si(this);
- ledger_b = abs(si.position_f () - (2* balltype_i () - 1))
+ Staff_symbol_referencer_interface si(sc);
+ ledger_b = abs(si.position_f () - (2* gh_scm2int (balltype) - 1))
> si.line_count ();
}
String style;
- SCM style_sym =get_elt_property ("style");
- if (balltype_i () >= 2 &&gh_string_p ( style_sym))
+ SCM style_sym =sc->get_elt_property ("style");
+ if (gh_scm2int (balltype) >= 2 && gh_string_p (style_sym))
{
style = ly_scm2string (style_sym);
}
- String idx = ("rests-") + to_str (balltype_i ()) + (ledger_b ? "o" : "") + style;
+ String idx = ("rests-") + to_str (gh_scm2int (balltype))
+ + (ledger_b ? "o" : "") + style;
- return lookup_l ()->afm_find (idx);
+ return sc-> lookup_l ()->afm_find (idx).create_scheme();
}
Scope::Scope (Scope const&s)
: id_dict_ (new Scheme_hash_table (*s.id_dict_))
{
- /*
- cloning not necessary.
-
- id_dict_ = new Hash_table<Protected_scm,Identifier*> (*s.id_dict_);
- for (Scope_iter ai (s); ai.ok(); ai++)
- {
- id_dict_->elem (ai.scm_key ()) = ai.val ()->clone ();
- }
- */
}
Scope::Scope ()
*/
+#define INFINITY_MSG "Infinity or NaN encountered"
Score_element::Score_element(SCM basicprops)
{
status_i_ = 0;
self_scm_ = SCM_EOL;
original_l_ = 0;
-#ifndef READONLY_PROPS
- basic_property_list_ = basicprops;
-#endif READONLY_PROPS
property_alist_ = basicprops;
pointer_alist_ = SCM_EOL;
self_scm_ = SCM_EOL;
original_l_ =(Score_element*) &s;
property_alist_ = s.property_alist_;
-#ifndef READONLY_PROPS
- basic_property_list_ = s.basic_property_list_;
- /*
- TODO: should copy the private part of the list.
- */
- SCM y ;
- for (SCM *sp = &s.property_alist_; *sp != basic_property_list_; sp = &SCM_CDR(*sp))
- {
- *sp = gh_cons (
- }
-#endif
+
pointer_alist_ = SCM_EOL;
status_i_ = s.status_i_;
Score_element::set_elt_property (String k, SCM val)
{
SCM sym = ly_symbol2scm (k.ch_C ());
-#ifndef READONLY_PROPS
- /*
- destructive if found in my part of the list.
- */
- for (SCM s = property_alist_; s != basic_property_list_; s =gh_cdr (s))
- {
- if (gh_caar (s)== sym)
- {
- gh_set_cdr_x (gh_car (s), val);
- return;
- }
- }
-/*
- not found in private list. Override in private list.
- */
-
-#endif
-
property_alist_ = gh_cons (gh_cons (sym, val), property_alist_);
}
}
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Score_element)
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Score_element)
- /*
+/*
ugh.
*/
-
-Molecule
-Score_element::do_brew_molecule () const
+SCM
+Score_element::scheme_molecule (SCM smob)
{
- SCM glyph = get_elt_property ("glyph");
+ Score_element * sc = unsmob_element (smob);
+ SCM glyph = sc->get_elt_property ("glyph");
if (gh_string_p (glyph))
{
- return lookup_l ()->afm_find (String (ly_scm2string (glyph)));
+ return sc->lookup_l ()->afm_find (String (ly_scm2string (glyph))).create_scheme ();
}
else
{
- Molecule m ;
- m.set_empty (true);
- return m;
+ return SCM_EOL;
}
}
void
Score_element::translate_axis (Real y, Axis a)
{
- dim_cache_[a].offset_ += y;
+ if (isinf (y) || isnan (y))
+ programming_error (_(INFINITY_MSG));
+ else
+ {
+ dim_cache_[a].offset_ += y;
+ }
}
Real
if (isinf (r) || isnan (r))
{
r = 0.0;
- programming_error ("Infinity or NaN encountered");
+ programming_error (INFINITY_MSG);
}
me->dim_cache_[a].offset_ +=r;
}
Score_element::common_refpoint (Score_element const* s, Axis a) const
{
/*
- I don't like the quadratic aspect of this code. Maybe this should
- be rewritten some time, but the largest chain of parents might be
- 10 high or so, so it shouldn't be a real issue. */
+ I don't like the quadratic aspect of this code, but I see no other
+ way. The largest chain of parents might be 10 high or so, so
+ it shouldn't be a real issue. */
for (Score_element const *c = this; c; c = c->dim_cache_[a].parent_l_)
for (Score_element const * d = s; d; d = d->dim_cache_[a].parent_l_)
if (d == c)
void
Span_bar::after_line_breaking ()
{
- Bar::after_line_breaking ();
Interval i (get_spanned_interval ());
+
+ /*
+ Bar::brew_molecule delivers a barline of y-extent (-h/2,h/2), so
+ we have to translate ourselves to be in the center of the
+ interval that we span. */
translate_axis (i.center (), Y_AXIS);
}
s = beam_l ()->get_elt_property ("shorten");
if (gh_number_p (s))
- info.idealy_f_ -= gh_double2scm (s);
+ info.idealy_f_ -= gh_scm2double (s);
Real interstaff_f = -beam_dir* calc_interstaff_dist (this, beam_l ());
(c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
*/
-
-#include "sustain-pedal.hh"
-#include "side-position-interface.hh"
+#include "score-element.hh"
#include "molecule.hh"
#include "lookup.hh"
-#include "staff-symbol-referencer.hh"
-void
-Sustain_pedal::after_line_breaking ()
+// update comment --hwn
+/*
+ Urg.
+ This is almost text
+ Problem is:
+ * we have no kerning
+ * symbols are at wrong place in font
+
+
+
+ Properties:
+
+ glyph -- text string (TODO: make one large glyph of the Ped symbol, removes need for do_brew_molecule ())
+
+*/
+
+struct Sustain_pedal
{
- return ;
- /*
- UGH. Should work automatically via offset callback.
- */
- Side_position_interface i (this);
- Direction d = i.get_direction ();
- i.set_direction (d);
-}
+public:
+ static SCM scheme_molecule (SCM);
+};
-MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Sustain_pedal);
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Sustain_pedal);
SCM
Sustain_pedal::scheme_molecule (SCM smob)
return mol.create_scheme ();
}
-Sustain_pedal ::Sustain_pedal(SCM s )
- : Item (s)
-{
-}
#include "dimension-cache.hh"
#include "engraver.hh"
#include "side-position-interface.hh"
-#include "text-item.hh"
+#include "item.hh"
#include "musical-request.hh"
#include "note-head.hh"
#include "stem.hh"
class Text_engraver : public Engraver
{
Link_array<Text_script_req> reqs_;
- Link_array<Text_item> texts_;
+ Link_array<Item> texts_;
public:
VIRTUAL_COPY_CONS(Translator);
{
Text_script_req * r = reqs_[i];
- Text_item *text = new Text_item (get_property ("basicTextScriptProperties"));
+ Item *text = new Item (get_property ("basicTextScriptProperties"));
Side_position_interface stafy (text);
SCM axisprop = get_property ("scriptHorizontal");
{
for (int i=0; i < texts_.size (); i++)
{
- Text_item *ti = texts_[i];
+ Item *ti = texts_[i];
Side_position_interface (ti).add_staff_support ();
typeset_element (ti);
}
/*
- text-item.cc -- implement Text_item
+ text-item.cc -- implement Item
source file of the GNU LilyPond music typesetter
*/
-#include "text-item.hh"
#include "debug.hh"
#include "molecule.hh"
#include "paper-def.hh"
#include "lookup.hh"
#include "staff-symbol-referencer.hh"
-Text_item::Text_item (SCM s)
- : Item (s)
+struct Text_item
{
-
-}
+ static SCM scheme_molecule (SCM);
+};
-MAKE_SCHEME_SCORE_ELEMENT_CALLBACKS(Text_item)
-Molecule
-Text_item::do_brew_molecule () const
+MAKE_SCHEME_SCORE_ELEMENT_NON_DEFAULT_CALLBACKS(Text_item)
+
+SCM
+Text_item::scheme_molecule (SCM sm)
{
- SCM style = get_elt_property ("style");
+ Score_element * s = unsmob_element (sm);
+
+ SCM style = s->get_elt_property ("style");
String st = gh_string_p (style) ? ly_scm2string (style) : "";
- SCM txt = get_elt_property ("text");
+ SCM txt = s-> get_elt_property ("text");
String t = gh_string_p (txt) ? ly_scm2string (txt) : "";
- Molecule mol = paper_l ()->lookup_l(0)->text (st, t, paper_l ());
+ Molecule mol = s->paper_l ()->lookup_l(0)->text (st, t, s->paper_l ());
- SCM s = get_elt_property ("word-space");
- if (gh_number_p (s))
+ SCM space = s->get_elt_property ("word-space");
+ if (gh_number_p (space))
{
Molecule m;
m.set_empty (false);
- mol.add_at_edge (X_AXIS, RIGHT, m, gh_scm2double (s)*
- staff_symbol_referencer (this).staff_space ());
+ mol.add_at_edge (X_AXIS, RIGHT, m, gh_scm2double (space)*
+ staff_symbol_referencer (s).staff_space ());
}
- return mol;
+ return mol.create_scheme ();
}
}
SCM
-Translator::get_property (String id) const
+Translator::get_property (char const * id) const
{
- return daddy_trans_l_->get_property (ly_symbol2scm (id.ch_C()));
+ return daddy_trans_l_->get_property (ly_symbol2scm (id));
}
SCM
mol.add_molecule (num);
}
- Real thick = paper_l ()->get_var ("tuplet_thick");
if (bracket_visibility)
{
- Real gap = paper_l () -> get_var ("tuplet_spanner_gap");
- Real height = staff_space;
+ SCM ss = paper_l ()->get_scmvar ("staffspace");
+ SCM lt = paper_l ()->get_scmvar ("stafflinethickness");
+
+ SCM thick = get_elt_property ("thick");
+ SCM gap = get_elt_property ("number-gap");
+
SCM at =gh_list(ly_symbol2scm ("tuplet"),
- gh_double2scm (height),
- gh_double2scm (gap),
- gh_double2scm (w),
- gh_double2scm (dy),
- gh_double2scm (thick),
- gh_int2scm (dir),
- SCM_UNDEFINED);
+ ss,
+ scm_product (gap, ss),
+ gh_double2scm (w),
+ gh_double2scm (dy),
+ scm_product (thick, lt),
+ gh_int2scm (dir),
+ SCM_UNDEFINED);
Box b;
mol.add_molecule (Molecule (b, at));
}
-
- //mol.translate_axis (dir * staff_space, Y_AXIS);
}
return mol;
}
-breve = \duration { -1 0 }
-longa = \duration { -2 0 }
-maxima = \duration { -3 0 }
+breve = \duration #'( -1 0)
+longa = \duration #'( -2 0 )
+maxima = \duration #'( -3 0 )
#(eval-string (ly-gulp-file "generic-property.scm"))
break = \penalty -1000000;
nobreak = \penalty 1000000;
-\include "scales.ly"
+\include "scale-definitions.ly"
melisma = \property Staff.melismaBusy = ##t
melismaEnd = \property Staff.melismaBusy = ##f
% in alphabetical order
% TODO: uniform naming.;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- basicBarlineProperties = #`(
+
+ %
+ % distances are given in stafflinethickness (thicknesses) and staffspace (distances)
+ %
+
+
+ basicBarProperties = #`(
(break-align-symbol . Staff_bar)
(molecule-callback . ,Bar::scheme_molecule)
(visibility-lambda . ,begin-of-line-invisible)
(breakable . #t)
+
+ ;;
+ ;; Ross. page 151 lists other values, we opt for a leaner look
+ ;;
+ (kern . 3.0)
+ (thin-kern . 3.0)
+ (hair-thickness . 1.6)
+ (thick-thickness . 6.0)
)
basicBarNumberProperties = #`(
)
basicDotsProperties = #`(
(molecule-callback . ,Dots::scheme_molecule)
+ (dot-count . 1)
)
basicDynamicLineSpannerProperties = #`(
(breakable . #t)
)
basicHyphenSpannerProperties = #`(
+ (thickness . 1.0)
+ (height . 0.4)
+ (minimum-length . 0.5)
(molecule-callback . ,Hyphen_spanner::scheme_molecule)
)
basicKeyProperties = #`(
basicSystemStartDelimiterProperties = #`(
(molecule-callback . ,System_start_delimiter::scheme_molecule)
(collapse-height . 1.0)
+ (thickness . 1.6)
+ (arch-height . 1.5)
+ (arch-angle . 50.0)
+ (arch-thick . 0.25)
+ (arch-width . 1.5)
+ (bracket-thick . 0.25)
+ (bracket-width . 2.0)
)
basicStemProperties = #`(
(molecule-callback . ,Stem::scheme_molecule)
)
basicTupletSpannerProperties = #`(
+ (number-gap . 2.0)
+ (thick . 1.0)
(molecule-callback . ,Tuplet_spanner::scheme_molecule)
)
basicStemTremoloProperties = #`(
% Toplevel initialisation file.
+
+foo = \tempo 4 = 100 ;
\version "1.3.59";
arithmetic_multiplier = 0.9 * \quartwidth ;
-#'Stem_tremolo::beam-width = 1.5 * \quartwidth ;
-
-#'Clef_item::visibility-lambda = #postbreak-only-visibility
-#'Key_item::visibility-lambda = #postbreak-only-visibility
-#'Breathing_sign::visibility-lambda = #non-postbreak-visibility
-
% catch suspect beam slopes, set slope to zero if
% outer stem is lengthened more than
beam_lengthened = 0.2 * \staffspace;
%}
gourlay_maxmeasures = 10.;
-
+% vertical space between lines.
line_kern = \staffspace;
-%{ Ross. page 151 lists these values, but we think that thick lines
-and kernings are too thick.
-
-bar_kern = 0.5 * \staffspace;
-bar_thinkern = 0.75 * \staffspace;
-barthick_thick = 0.5* \staffspace;
-barthick_score = 0.13333* \staffspace;
-barthick_thin = 0.1*\staffspace;
-
-%}
-
-bar_kern = 3.0 * \stafflinethickness;
-bar_thinkern = 3.0 * \stafflinethickness;
-barthick_thick = 6.0* \stafflinethickness;
-barthick_thin = 1.6*\stafflinethickness;
-barthick_score = 1.6*\stafflinethickness;
-
-bracket_arch_thick = \staffspace / 4.0;
-bracket_width = 2.0 * \staffspace;
-bracket_thick = \staffspace / 4.0;
-bracket_arch_height = 1.5 * \staffspace;
-bracket_arch_width = \bracket_arch_height;
-bracket_arch_angle = 50.0;
-
-tuplet_spanner_gap = 2.0 * \staffspace;
-tuplet_thick = 1.0*\stafflinethickness;
volta_thick = 1.6*\stafflinethickness;
volta_spanner_height = 2.0 *\staffspace;
extender_height = 0.8*\stafflinethickness;
-hyphen_thickness = 0.05*\font_normal;
-hyphen_height = 0.2*\font_normal;
-hyphen_minimum_length = 0.25*\font_normal;
% Multi-measure rests
multi_measure_rest_x_minimum = 2.5*\staffheight;
% unit for note collision resolving
collision_note_width = \notewidth; %ugh.
-% deprecated!
-postBreakPadding = 0.0;
-
% optical correction amount.
stemSpacingCorrection = 0.5*\staffspace;
% in staffspace
articulation_script_padding_default = 1.0;
-% Backward compatibility -- has no function;
-Gourlay = 0.0;
-Wordwrap =0.0;
\include "engraver.ly";
)
)
+;; silly, use alist?
(define (find-notehead-symbol duration style)
(case style
((cross) "2cross")
import time
import string
import getopt
-import __main__
fullname = "unknown"
index_file=''
-banner_file = ''
changelog_file=''
-changes =''
+package_name = ''
package_version = ''
mail_address = '(address unknown)'
except KeyError:
pass
-
webmaster= mail_address
try:
webmaster= os.environ['WEBMASTER']
except KeyError:
pass
+header_file = ''
+footer_file = ''
+default_header = r"""
+"""
-
-footer_fn = ''
-footer = r"""<hr>Please take me <a href=%s>back to the index</a>
+default_footer = r"""<hr>Please take me <a href=%s>back to the index</a>
of %s
<!-- package name %s>
<!-- webmaster fields. %s %s>
This page was built from %s-%s by
<address><br>%s <<a href="mailto:%s">%s</a>>, %s.</address><p></font>"""
-package_name = ''
-
-(options, files) = getopt.getopt(sys.argv[1:], 'c:hp:', [
- 'name=', 'footer=', 'version=',
- 'changelog=', 'help', 'news=', 'index='])
-def gulp_file(f):
+def gulp_file (f):
try:
i = open(f)
i.seek (0, 2)
def help ():
sys.stdout.write (r"""Usage: add-html-footer [OPTION]... HTML-FILE
-Add a nice footer, add the top of the ChangLog file (up to the ********)
+Add header, footer and top of ChangLog file (up to the ********) to HTML-FILE
+
Options:
--h, --help print this help
---version package version
---name package_name
---footer footer file
+ --changelog=FILE use FILE as ChangeLog [ChangeLog]
+ --footer=FILE use FILE as footer
+ --header=FILE use FILE as header
+ -h, --help print this help
+ --index=URL set homepage to URL
+ --name=NAME set package_name to NAME
+ --version=VERSION set package version to VERSION
""")
sys.exit (0)
+(options, files) = getopt.getopt(sys.argv[1:], 'h', [
+ 'changelog=', 'footer=', 'header=', 'help', 'index=',
+ 'name=', 'version='])
+
for opt in options:
o = opt[0]
a = opt[1]
- if o == '--news' or o == '--changelog' or o == '-c':
+ if o == '--changelog':
changelog_file = a
+ elif o == '--footer':
+ footer_file = a
+ elif o == '--header':
+ header_file = a
+ elif o == '-h' or o == '--help':
+ help ()
elif o == '--index':
index_file = a
- elif o == '--footer':
- footer_fn = a
elif o == '--name':
package_name = a
- elif o == '-h' or o == '--help':
- help ()
elif o == '--version':
package_version = a
else:
raise 'unknown opt ', o
-def set_vars():
+
+def set_vars ():
+ global fullname
os.environ["CONFIGSUFFIX"] = 'www';
if os.name == 'nt':
import ntpwd
import pwd
pw = pwd.getpwuid (os.getuid());
- f =pw[4]
+ f = pw[4]
f = string.split (f, ',')[0]
- __main__.fullname=f
-set_vars ()
+ fullname = f
+#burp
+def compose_header ():
+ global default_header
+ head = default_header
+ if header_file:
+ head = gulp_file (header_file)
+ return head
-def footstr(index):
- ft = __main__.footer
+def compose_footer (index):
+ global default_footer
+ foot = default_footer
- if footer_fn:
- try:
- ft = open (footer_fn).read ()
- except:
- raise 'oops: ' , footer_fn
+ if footer_file:
+ foot = gulp_file (footer_file)
-
- s = ft % (index, package_name, package_name, webmaster, webmaster)
+ s = foot % (index, package_name, package_name, webmaster, webmaster)
s = s + builtstr % (package_name, package_version, fullname,
mail_address, mail_address,
time.strftime ('%c %Z', time.localtime (time.time ())))
return s
-banner = footstr (index_file)
-banner_id = '<! banner_id >'
-
-
-
+set_vars ()
+header = compose_header ()
+footer = compose_footer (index_file)
+header_tag = '<! header_tag >'
+footer_tag = '<! footer_tag >'
def do_file (s):
-
if changelog_file:
changes = gulp_file (changelog_file)
# urg?
changes = changes[:m.start (0)]
s = re.sub ('top_of_ChangeLog', '<XMP>\n'+ changes + '\n</XMP>\n', s)
+ if re.search (header_tag, s) == None:
+ body='<BODY BGCOLOR=WHITE><FONT COLOR=BLACK>'
+ s = re.sub ('(?i)<body>', body, s)
+ if re.search ('(?i)<BODY', s):
+ s = re.sub ('(?i)<body[^>]*>', body + header, s)
+ elif re.search ('(?i)<html', s):
+ s = re.sub ('(?i)<html>', '<HTML>' + header, s)
+ else:
+ s = header + s
- if re.search (banner_id, s) == None:
- s = banner_id + s
- else:
- return s
-
- s = re.sub ('(?i)<body>', '<BODY BGCOLOR=WHITE><FONT COLOR=BLACK>', s)
- # do title.
- #s = check_tag ('<body', '', s, 0)
- if re.search ('(?i)</body', s):
- s = re.sub ('(?i)</body>', banner + '</BODY>', s)
- elif re.search ('(?i)</html', s):
- s = re.sub ('(?i)</html>', banner + '</HTML>', s)
- else:
- s = s + banner
+ s = header_tag + s
+
+ if re.search (footer_tag, s) == None:
+ s = s + footer_tag
+
+ if re.search ('(?i)</body', s):
+ s = re.sub ('(?i)</body>', footer + '</BODY>', s)
+ elif re.search ('(?i)</html', s):
+ s = re.sub ('(?i)</html>', footer + '</HTML>', s)
+ else:
+ s = s + footer
return s
+
for f in files:
s = gulp_file (f)
s = do_file (s)
at-dir = $(doc-dir)/
at-ext = .in
-footify=$(PYTHON) $(step-bindir)/add-html-footer.py --name $(PACKAGE_NAME) --version $(TOPLEVEL_VERSION) --footer $(depth)/Documentation/footer.html.in
+footify=$(PYTHON) $(step-bindir)/add-html-footer.py --name $(PACKAGE_NAME) --version $(TOPLEVEL_VERSION) --header=$(depth)/Documentation/header.html.in --footer $(depth)/Documentation/footer.html.in
footify-all-command=$(footify) `$(FIND) . -name '*.html' -print`