* Fixed slur attachment correction bug.
-* Added some comments about brokenness of non-empty text, ie text that has
- a width.
-
* Made some fixes to Coriolan.
+1.3.89.hwn1
+===========
+
+* Only open files, not directories
+
+* bugfix: textNonEmpty.
+
+* Look ahead in auto-change iterator for rests. This means rests
+before the note leading to an automatic staff switch are switched as
+well (improves the looks of scarlatti-test). Associated fixes and
+additions for Music_iterator::skip () and friends.
+
+* Bugfix: only quantise staccato inside the staff.
+
+* cleanups for beam and stem. Removed global GUILE namespace calls
+from Beam and Stem.
+
1.3.89
======
met through music.
- Those deserving special mentioning (in no particular order):
-Esther, Marijke, Heike, Inge, Judith, Hannah, Auke, Ilse, Evelyn,
-Maartje, Suzanne, Ilse (gee, again?) and last (but certainly not
-least) Janneke!
+ Those deserving special mentioning (in no particular order): Esther,
+Marijke, Heike, Inge, Judith, Hannah, Auke, Ilse, Evelyn, Maartje, Suzanne,
+Ilse (gee, again?), Irene and last (but certainly not least) Janneke!
HWN
LATEX_FILES =$(wildcard *.latex)
-DVI_FILES = $(addprefix $(outdir)/,$(LATEX_FILES:.latex=.dvi) $(TELY_FILES:.tely=.dvi))
+
+# todo: add latex.
+DVI_FILES = $(addprefix $(outdir)/, $(TELY_FILES:.tely=.dvi))
EXTRA_DIST_FILES= $(LATEX_FILES) $(wildcard *.itexi *.itely)
* Point and click functionality using emacs and Xdvi.
+* Automatic part combining for orchestral scores.
+
* Improved design and implementation: Complete rewrite of the
internals: LilyPond is smaller, cleaner, more flexible, etc.
- Improved speed (undone for now, by .73 + .74),
with comparable memory footprint
+ - More tweakability using less memory with new property push
+ mechanism.
+
- Improved robustness: Lily almost never crashes.
* Piano pedal support
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=3
-PATCH_LEVEL=89
-MY_PATCH_LEVEL=jcn1
+PATCH_LEVEL=90
+MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
path.cc - manipulation of paths and filenames.
*/
+
#include <stdio.h>
+#include <errno.h>
+#include <sys/stat.h>
#include "config.h"
#include "file-path.hh"
path += nm;
DEBUG_OUT << path << "? ";
+
+ /*
+ Check if directory. TODO: encapsulate for autoconf
+ */
+ struct stat sbuf;
+ if (stat (path.ch_C(), &sbuf) == ENOENT)
+ continue;
+
+ if (!(sbuf.st_mode & __S_IFREG))
+ continue;
+
FILE *f = fopen (path.ch_C(), "r"); // ugh!
if (f)
{
+++ /dev/null
-% Generated by mudela-book.py; options are nofly
-\include "paper16.ly"
-\paper { linewidth = 390.000000 \pt; }
-
-% copied from file `lyric-combine.ly'
-\header{
-filename = "twinkle-pop.ly";
-%title = "Ah, vous dirais-je, maman ";
-description = "twinkle twinkle in pop-song-settings";
-composer = "traditional";
-enteredby = "HWN, chords by Johan Vromans";
-copyright = "public domain";
-}
-
-\version "1.3.59";
-
-m =\notes \relative c'' {
- \property Staff.automaticMelismata = ##t
- \autoBeamOff
- g4 r8 \times 2/3 { g'8( f )e } r8 \grace { [d16 c b] } e4
- \emptyText
- d8.^"melisma" \melisma c16
- \melismaEnd
- b }
-
-noisebeat =\notes \relative c'' {g16 g g g }
-noise = { \noisebeat \noisebeat \noisebeat \noisebeat \noisebeat \noisebeat }
-textI = \lyrics { la2 __ la -- la __ la la la la la }
-textII = \lyrics { da -- da __ da -- da da da da da }
-
-\score {
- \notes < \context Staff = SA \m
- \context Lyrics = LA { s1 }
- \context Staff = SB { s1 }
- \context Lyrics = LB { s1 }
- \context Staff = SC \noise
-
- \addlyrics
- \context Staff = SB \m
- < \context Lyrics = LA \textI
- \context Lyrics = LB \textII
- >
-
- >
-}
-
-
+++ /dev/null
-\score
-{
- \context StaffGroup = a <
- \context PianoStaff = b <
- \context Staff = "c" \notes\relative c'' { b4 b \bar "empty"; \break b b }
- \context Staff = "d" \notes\relative c'' { b4 b b b }
- >
- >
-
- \paper {
- indent=100.0\mm;
- linewidth=150.0\mm;
- \translator {
- \StaffContext
- \consists "Instrument_name_engraver";
- numberOfStaffLines = #1
- marginScriptPadding = #30 % urg: this is in PT
- instrument = #"Foo"
- instr = #"Bar"
- }
- \translator {
- \StaffGroupContext
- \consists "Instrument_name_engraver";
- marginScriptPadding = #10 % urg: this is in PT
- instrument = #"Piano\n(For rehearsal only)"
- }
- }
-}
+++ /dev/null
-\score {
- \notes \relative c'' {
- c4 <d4 \context Staff = "another" e4> f
- }
-}
+++ /dev/null
-
-\score { \context PianoStaff \notes <
-\context Staff = up <{ c4 }
- \times 2/3 { [c8 c\translator Staff = down c] }>
- \context Staff = down c4
-
- >
-
- }
-
+%
+% irregular spacing.
+
\score{
\context PianoStaff <
\context Staff = upper \notes\relative c''{
+++ /dev/null
-
-\score {\notes c4 }
+++ /dev/null
-\score{
- <
- \context Staff = flauti <
- \context Voice=one \partcombine Voice
- \context Thread=one \notes\relative c''
- {
- %c1
- c2 c2
- }
- \context Thread=two \notes\relative c''
- {
- }
- >
- >
- \paper{
-
- }
-}
+++ /dev/null
-% f.ly:4:20: warning: Must stop before this music ends:
-
-
-\score { \notes {
- \addlyrics { c4 } { f4}
-}}
+++ /dev/null
-
-% GENERATED AUTOMATICALLY
-
-\header {
- title = "Not Clapping Music" ;
- instrument = "For four hands";
- composer = "Not Steve Reich";
- year = "1972";
-}
-
-
-beaming = \notes \repeat unfold 13 { \repeat unfold 3 { [ s2 ] } \bar ":|:"; }
-
-\score {
- \notes <
-% \property Score.midiInstrument = "woodblock"
- \property Score.midiInstrument = "melodic tom"
- \context RhythmicStaff = SA
- \context Voice = VA <
- \time 12/8 ;
- { c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 r } \beaming
- s8^"No accents whatsoever"
- { s1. \mark "8$\\times$"; }
-
-
- >
- \context RhythmicStaff = SB
- \context Voice = VA < { c8 c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 r c8 r c8 c8 r c8 c8 r c8 c8 c8 c8 r c8 c8 r c8 c8 r c8 c8 c8 r r c8 c8 r c8 c8 r c8 c8 c8 r c8 c8 c8 r c8 c8 r c8 c8 c8 r c8 r c8 r c8 c8 r c8 c8 c8 r c8 r c8 r c8 c8 r c8 c8 c8 r c8 r c8 c8 c8 c8 r c8 c8 c8 r c8 r c8 c8 r c8 r c8 c8 c8 r c8 r c8 c8 r c8 r c8 c8 c8 r c8 r c8 c8 r c8 c8 c8 c8 c8 r c8 r c8 c8 r c8 c8 r } \beaming >
- >
- \paper{ \translator { \ScoreContext \consists Mark_engraver; }}
- \midi {\tempo 4 = 130;}
- }
+++ /dev/null
-%
-% Example of shorthand trickery
-% \property Context.foo = bar
-%
-foo = \property Staff.foo = #"bar"
-%
-%
-%
-
-one = \context Voice\notes\relative c {
- a1 b c
-}
-
-
-two = \context Voice\notes {
- a1\foo
- b
- < c\foo e >
-}
-
-\score{
- \context OtherStaff=one <
- \one
- \two
- >
- \paper{
- \translator {
- \StaffContext
- \name "OtherStaff";
- }
- \translator {
- \ScoreContext
- \accepts "OtherStaff";
- }
- }
-}
+++ /dev/null
-\score { \notes \context Staff {
-\stemup
-f'-. g-. a-. b-. c-. d-. e-.
-}}
}
voicedefault = \notes {
\property Staff.timeSignatureStyle="C"
- \time 4/4; \key f;
+ \time 4/4; \key f \major;
\tempo 4 = 200;
}
\score{
+++ /dev/null
-
-\score { \context PianoStaff \notes <
-
-{ \times 2/3 { [c8 c\translator Staff = down c] }}
- \context Staff = down c4
-
- >
-
- }
-
forced_stem_shorten3=0.;
\translator{
\PianoStaffContext
- maxVerticalAlign=42.\pt;
- minVerticalAlign=42.\pt;
+ maxVerticalAlign=8.4;
+ minVerticalAlign=8.4;
}
\translator{\StaffContext
timeSignatureStyle="C";}
lh=\property Thread.noteHeadStyle = #'diamond
n=\property Thread.fontSize=#0
sm=\property Thread.fontSize=#-1
-su=\property Voice.verticalDirection=#1
-sd=\property Voice.verticalDirection=#-1
+% su=\property Voice.verticalDirection=#1
+% sd=\property Voice.verticalDirection=#-1
+
+su=\property Voice.basicStemProperties \push #'direction = #1
+sd=\property Voice.basicStemProperties \push #'direction = #-1
+
zs=\property Voice.forceHorizontalShift=#0.0
ls=\property Voice.forceHorizontalShift=#-0.6
sls=\property Voice.forceHorizontalShift=#-0.22
\score {
\notes \context PianoStaff <
\context Staff = "up" {
- \autochange Staff \relative c' { g4 a b c d e f g }
+ \autochange Staff \context Voice = VA < \relative c' { g4 a b c d r4 a g } >
}
\context Staff = "down" {
\clef bass;
}
-Pitch_interrogate_req* spanish_inquisition; // nobody expects it
+/*
+ Look ahead to find first pitches to determine staff position.
+ WARNING: this means that
-void
-Auto_change_iterator::process (Moment m)
+ \autochange Staff \notes { .... \context Staff = otherstaff { .. } .. }
+
+ will confuse the autochanger, since it will not notice that the
+ music for OTHERSTAFF is not his.
+
+ PRECONDITION: this->ok() holds.
+*/
+Array<Musical_pitch>
+Auto_change_iterator::pending_pitch (Moment m) const
{
- Music_wrapper_iterator::process (m);
+ Music_iterator * iter = child_iter_p_ ->clone ();
+ Array<Musical_pitch> ps;
+ while (1)
+ {
+ SCM muses = iter->get_music (m);
+ for (SCM s = muses; gh_pair_p (s); s=gh_cdr (s))
+ if (Note_req* nr = dynamic_cast<Note_req*> (unsmob_music (gh_car (s))))
+ {
+ ps.push (nr->pitch_);
+ }
+
+ if (ps.size ())
+ break;
+
+ iter->skip (m);
+ if (!iter->ok())
+ break;
+
+ m = iter->pending_moment ();
+ }
- if (!spanish_inquisition)
- spanish_inquisition = new Pitch_interrogate_req;
+ delete iter;
+ return ps;
+}
- Music_iterator *it = try_music (spanish_inquisition);
+void
+Auto_change_iterator::process (Moment m)
+{
+ /*
+ first we get the pitches, then we do the real work.
+ Music_wrapper_iterator::process() might process (and throw away)
+ pitches we need. */
+ Array<Musical_pitch> ps = pending_pitch (m);
- if (it && spanish_inquisition->pitch_arr_.size ())
+ Music_wrapper_iterator::process (m);
+ if (ps.size ())
{
- Musical_pitch p = spanish_inquisition->pitch_arr_[0];
+ Musical_pitch p = ps[0];
Direction s = Direction (sign(p.steps ()));
if (s != where_dir_)
{
String to_id = (s >= 0) ? "up" : "down";
Auto_change_music const * auto_mus = dynamic_cast<Auto_change_music const* > (music_l_);
- change_to (it, auto_mus->what_str_, to_id);
+ change_to (child_iter_p_, auto_mus->what_str_, to_id);
}
}
-
- spanish_inquisition->pitch_arr_.clear ();
}
Auto_change_iterator::Auto_change_iterator( )
return SCM_EOL;
}
-/*
- FIXME
- */
Direction
Beam::get_default_dir (Score_element*me)
{
} while (flip(&d) != DOWN);
+ SCM func = me->get_elt_property ("dir-function");
+ SCM s = gh_call2 (func,
+ gh_cons (gh_int2scm (count[UP]),
+ gh_int2scm (count[DOWN])),
+ gh_cons (gh_int2scm (total[UP]),
+ gh_int2scm (total[DOWN])));
- SCM s = scm_eval2 (gh_list (ly_symbol2scm ("beam-dir-algorithm"),
- ly_quote_scm (gh_cons (gh_int2scm (count[UP]),
- gh_int2scm (count[DOWN]))),
- ly_quote_scm (gh_cons (gh_int2scm (total[UP]),
- gh_int2scm (total[DOWN]))),
- SCM_UNDEFINED),
- SCM_EOL);
if (gh_number_p (s) && gh_scm2int (s))
return to_dir (s);
int multiplicity = get_multiplicity (me);
- // grace stems?
- SCM shorten = scm_eval2 (ly_symbol2scm ("beamed-stem-shorten"), SCM_EOL);
-
+ SCM shorten = me->get_elt_property ("beamed-stem-shorten");
if (shorten == SCM_EOL)
return;
Real staffspace = me->paper_l ()->get_var ("staffspace");
- SCM space_proc = me->get_elt_property ("beam-space-function");
+ SCM space_proc = me->get_elt_property ("space-function");
SCM space = gh_call1 (space_proc, gh_int2scm (beam_multiplicity));
- Real thick = gh_scm2double (me->get_elt_property ("beam-thickness")) *staffspace;
+ Real thick = gh_scm2double (me->get_elt_property ("thickness")) *staffspace;
Real interbeam_f = gh_scm2double (space) * staffspace;
// ugh -> use commonx
Beam::quantise_dy_f (Score_element*me,Real dy)
{
Array<Real> a;
- for (SCM s = scm_eval2 (ly_symbol2scm ("beam-height-quants"), SCM_EOL);
- s !=SCM_EOL; s = gh_cdr (s))
+
+ SCM proc = me->get_elt_property ("height-quants");
+ SCM quants = gh_call2 (proc, me->self_scm (),
+ gh_double2scm (me->paper_l ()->get_var ("stafflinethickness")
+ / me->paper_l ()->get_var ("staffspace")));
+
+
+ for (SCM s = quants; gh_pair_p (s); s = gh_cdr (s))
a.push (gh_scm2double (gh_car (s)));
if (a.size () <= 1)
int multiplicity = get_multiplicity (me);
Real staff_space = Staff_symbol_referencer::staff_space (me);
- SCM quants = scm_eval2 (gh_list (ly_symbol2scm ("beam-vertical-position-quants"),
- gh_int2scm (multiplicity),
- gh_double2scm (dy/staff_space),
- SCM_UNDEFINED),
- SCM_EOL);
+ Real thick = me->paper_l ()->get_var ("stafflinethickness");
+
+ SCM proc = me->get_elt_property ("vertical-position-quant-function");
+ SCM quants = scm_apply (proc,
+ me->self_scm (),
+ gh_list (gh_int2scm (multiplicity),
+ gh_double2scm (dy/staff_space),
+ gh_double2scm (thick/staff_space),
+ SCM_EOL, SCM_UNDEFINED));
+
Array<Real> a;
- for (; quants != SCM_EOL; quants = gh_cdr (quants))
+ for (; gh_pair_p (quants); quants = gh_cdr (quants))
a.push (gh_scm2double (gh_car (quants)));
if (a.size () <= 1)
/*
beams to go with one stem.
- BURP
- clean me up.
+ FIXME: clean me up.
*/
Molecule
Beam::stem_beams (Score_element*me,Item *here, Item *next, Item *prev)
int multiplicity = get_multiplicity (me);
Real staffspace =me->paper_l ()->get_var ("staffspace");
- SCM space_proc = me->get_elt_property ("beam-space-function");
+ SCM space_proc = me->get_elt_property ("space-function");
SCM space = gh_call1 (space_proc, gh_int2scm (multiplicity));
- Real thick = gh_scm2double (me->get_elt_property ("beam-thickness")) *staffspace;
+ Real thick = gh_scm2double (me->get_elt_property ("thickness")) *staffspace;
Real interbeam_f = gh_scm2double (space) * staffspace;
Real bdy = interbeam_f;
Molecule leftbeams;
Molecule rightbeams;
- /*
- UGH: make a property of this.
- */
Real nw_f;
if (!Stem::first_head (here))
nw_f = 0;
else {
int t = Stem::type_i (here);
- SCM proc = me->get_elt_property ("beam-flag-width-function");
+ SCM proc = me->get_elt_property ("flag-width-function");
SCM result = gh_call1 (proc, gh_int2scm (t));
nw_f = gh_scm2double (result) * staffspace;
}
int j = 0;
Real gap_f = 0;
- SCM gap = me->get_elt_property ("beam-gap");
+ SCM gap = me->get_elt_property ("gap");
if (gh_number_p (gap))
{
int gap_i = gh_scm2int ( (gap));
protected:
virtual void process (Moment);
+
+ Array<Musical_pitch> pending_pitch (Moment)const;
private:
+
+
Direction where_dir_;
void change_to (Music_iterator* , String, String);
};
height -- real (dy)
- damping -- amount of beam slope damping. (int)
- should beam slope be damped? 0: no, 1: yes, 100000: horizontal beams
-
-
- molecule-callback --
- beam-thickness -- weight of beams, in staffspace
+ Read-only
+ =========
+
+ flag-width-function --
- beam-space-function -- function of type multiplicity -> real (in staffspace)
+ damping -- amount of beam slope damping. (int)
+ should beam slope be damped? 0: no, 1: yes, 100000: horizontal beams
default-neutral-direction -- which direction to choose if we're in
the middle of the staff
- after-line-breaking-callback --
+ thickness -- weight of beams, in staffspace
+
+ space-function -- function of type multiplicity -> real (in staffspace)
+ beamed-stem-shorten --
+
+ height-quants --
+
+ vertical-position-quant-function --
+
+ dir-function --
+
damping -- damping factor (real).
outer-stem-length-limit -- catch suspect beam slopes, set slope to zero if
outer stem is lengthened more than this (in staffspace)
slope-limit -- set slope to zero if slope is running away steeper than this.
-
*/
class Beam
{
class Performer;
class Performer_group_performer;
class Piano_bar_engraver;
-class Pitch_interrogate_req;
+
class Pitch_squash_engraver;
class Property_iterator;
class Rational;
ok () -- events left ?
pending_mom () -- time tag of the next event to be processed.
+ PRECONDITION: this->ok() holds.
- process (M) -- process all at M (Precondition: no events exist before
- M). Side-effects:
+ process (M) -- process all at M (Precondition: no events exist
+ before M, this->ok() holds). Side-effects:
* This removes all events at M from the pending queue.
TODO:
- merge pending_moment and process.
+ merge pending_moment and process?
*/
class Music_iterator
VIRTUAL_COPY_CONS (Music_iterator);
Moment music_length_mom () const;
-
-
Music_iterator ();
Music_iterator (Music_iterator const&);
virtual ~Music_iterator ();
VIRTUAL_COPY_CONS (Music);
};
-/**
- What pitches have ben acked ?
- */
-class Pitch_interrogate_req : public Request
-{
-public:
- Array<Musical_pitch> pitch_arr_;
- VIRTUAL_COPY_CONS (Music);
-};
-
-/**
- What rhythms have ben acked ?
- */
-class Rhythm_interrogate_req : public Request
-{
-public:
- Array<Duration> duration_arr_;
- VIRTUAL_COPY_CONS (Music);
-};
/**
virtual Moment pending_moment () const;
virtual bool ok () const;
virtual SCM get_music (Moment)const;
+ virtual void skip (Moment);
protected:
virtual void process (Moment);
y-free -- ?
- */
+ control-points --
+
+
+
+ Read-only
+ =========
+
+ extremity-rules --
+
+ extremity-offset-alist --
+
+ thickness --
+
+*/
class Slur
{
public:
/**
This spanner draws the lines of a pstaff.
The bottom line is position 0.
+
+ TODO: add stafflinethickness as parameter.
*/
class Staff_symbol
{
{
return now_mom () < note_end_mom_;
}
- else if (Pitch_interrogate_req *p = dynamic_cast<Pitch_interrogate_req*> (m))
- {
- for (int i= note_req_l_arr_.size (); i--;)
- p->pitch_arr_.push (note_req_l_arr_[i]->pitch_); // GUH UGH UGHUGH.
- return true;
- }
- else if (Rhythm_interrogate_req *r = dynamic_cast<Rhythm_interrogate_req*> (m))
- {
- for (int i= note_req_l_arr_.size (); i--;)
- r->duration_arr_.push (note_req_l_arr_[i]->duration_); // GUH UGH UGHUGH.
- return true;
- }
return false;
}
rest_req_l_ = r;
return true;
}
- else if (Rhythm_interrogate_req *r = dynamic_cast<Rhythm_interrogate_req*> (m))
- {
- if (rest_req_l_)
- r->duration_arr_.push (rest_req_l_->duration_); // GUH UGH UGHUGH.
- return true;
- }
return false;
}
Sequential_music_iterator::~Sequential_music_iterator()
{
- if (iter_p_)
- {
-#if 0
- if (iter_p_->ok () )
- music_l_->origin ()->warning (_ ("Must stop before this music ends"));
-#endif
- delete iter_p_;
- }
+ delete iter_p_;
}
void
/*
+ Retrieve all music (starting at HERE), until a music with length L >
+ 0 is found. From the precondition, we know that UNTIL is later than
+ the earliest event. Hence we know
-
- Hier staat in feite: haal alle muziek op (startend op tijd HERE) tot
- je iets met lengte L > 0 tegenkomt. Aangezien de preconditie is dat
- UNTIL het eerstvolgende event is, weet je (per definitie)
-
L >= (UNTIL - HERE)
- en iets wat hierna komt (op tijd T) komt dus na tijd
+ so something that comes after this thing with L > 0 happens after
HERE + L >= HERE + (UNTIL - HERE) = UNTIL
- Dus als je een L>0 tegenkomt, wil je de rest niet meer. Aangezien
- alles wat tot nu toe hebt gespaard op HERE begint, is dat precies wat
- je nodig hebt.
-
- Misschien kan je deze comment erbij stoppen, en moeten we de
- eigenschappen van het muziek datatype wat formaliseren, zodat deze
- redenering helderder is.
+ Hence all events after the one with L>0 are uninteresting, so we
+ ignore them.
+
*/
SCM
void
Sequential_music_iterator::skip (Moment until)
{
- SCM curs = cursor_;
while (1)
{
Moment l =iter_p_->music_length_mom ();
delete iter_p_;
iter_p_ =0;
- curs = gh_cdr (curs);
+ cursor_ = gh_cdr (cursor_);
- if (!gh_pair_p (curs))
+ if (!gh_pair_p (cursor_))
return ;
else
- iter_p_ = get_iterator_p (unsmob_music (gh_car (curs)));
+ iter_p_ = get_iterator_p (unsmob_music (gh_car (cursor_)));
}
}
/*
Callback that quantises in staff-spaces, rounding in the direction
- of the elements "direction" elt property. */
+ of the elements "direction" elt property.
+
+ Only rounds when we're inside the staff, as determined by
+ Staff_symbol_referencer::staff_radius() */
Real
Side_position::quantised_position (Score_element *me, Axis )
{
{
Real p = Staff_symbol_referencer::position_f (me);
Real rp = directed_round (p, d);
-
+ Real rad = Staff_symbol_referencer::staff_radius (me) *2 ;
int ip = int (rp);
- if ((ip % 2) == 0)
+
+ if (abs (ip) < rad && (ip % 2) == 0)
{
ip += d;
rp += d;
Simultaneous_music_iterator::Simultaneous_music_iterator ()
{
separate_contexts_b_ = false;
- cursor_i_ = 0;
}
Simultaneous_music_iterator::Simultaneous_music_iterator (Simultaneous_music_iterator const& src)
: Music_iterator (src)
{
- cursor_i_ = src.cursor_i_;
separate_contexts_b_ = src.separate_contexts_b_;
- for (Cons<Music_iterator> *p = children_p_list_.head_; p; p = p->next_)
+ for (Cons<Music_iterator> *p = src.children_p_list_.head_; p; p = p->next_)
{
Music_iterator *i = p->car_;
children_p_list_.append (new Killing_cons<Music_iterator> (i->clone (), 0));
children_p_list_.junk ();
}
-/*
- Should roll next () into this as well
-
-
- huh? --hwn
- */
SCM
Simultaneous_music_iterator::get_music (Moment m)const
{
}
}
+void
+Simultaneous_music_iterator::skip (Moment until)
+{
+ for (Cons<Music_iterator> **pp = &children_p_list_.head_; *pp;)
+ {
+ Music_iterator * i = (*pp)->car_;
+ if (i->pending_moment() <= until)
+ {
+ i->skip (until);
+ }
+ if (!i->ok())
+ delete children_p_list_.remove_cons (pp);
+ else
+ pp = &(*pp)->next_;
+ }
+}
+
Moment
Simultaneous_music_iterator::pending_moment() const
{
b =p->car_->try_music (m);
return b;
}
+
+
{
if (!gh_symbol_p (index_cell (me->get_elt_property ("attachment"), dir)))
{
-
- // for (SCM s = get_elt_property ("slur-extremity-rules"); s != SCM_EOL; s = gh_cdr (s))
-
- // FIXME: global GUILE scope used!
- for (SCM s = scm_eval2 (ly_symbol2scm ("slur-extremity-rules"),
- SCM_EOL);
+ for (SCM s = me->get_elt_property ("extremity-rules");
s != SCM_EOL; s = gh_cdr (s))
{
SCM r = gh_call2 (gh_caar (s), me->self_scm (),
}
-
- // FIXME
- int stemdir = stem ? Stem::get_direction (stem) : 1;
+ SCM alist = me->get_elt_property ("extremity-offset-alist");
+int stemdir = stem ? Stem::get_direction (stem) : 1;
int slurdir = gh_scm2int (me->get_elt_property ("direction"));
SCM l = scm_assoc
- (scm_listify (a,
- gh_int2scm (stemdir * dir),
- gh_int2scm (slurdir * dir),
- SCM_UNDEFINED),
- scm_eval2 (ly_symbol2scm ("slur-extremity-offset-alist"), SCM_EOL));
-
+ (scm_listify (a,
+ gh_int2scm (stemdir * dir),
+ gh_int2scm (slurdir * dir),
+ SCM_UNDEFINED), alist);
+
if (l != SCM_BOOL_F)
{
o += ly_scm2offset (gh_cdr (l)) * ss * dir;
}
else
{
- s = scm_eval2 (ly_symbol2scm ((type_str + "stem-length").ch_C()),
- SCM_EOL);
+ s = me->get_elt_property("lengths");
for (SCM q = s; q != SCM_EOL; q = gh_cdr (q))
a.push (gh_scm2double (gh_car (q)));
a.clear ();
- s = scm_eval2 (ly_symbol2scm ((type_str + "stem-shorten").ch_C()),
- SCM_EOL);
- for (SCM q = s; q != SCM_EOL; q = gh_cdr (q))
+ s = me->get_elt_property ("stem-shorten");
+ for (SCM q = s; gh_pair_p (q); q = gh_cdr (q))
a.push (gh_scm2double (gh_car (q)));
int multiplicity = Beam::get_multiplicity (beam);
- SCM space_proc = beam->get_elt_property ("beam-space-function");
+ SCM space_proc = beam->get_elt_property ("space-function");
SCM space = gh_call1 (space_proc, gh_int2scm (multiplicity));
Real interbeam_f = gh_scm2double (space) * staff_space;
- Real thick = gh_scm2double (beam->get_elt_property ("beam-thickness"));
+ Real thick = gh_scm2double (beam->get_elt_property ("thickness"));
Stem_info info;
info.idealy_f_ = chord_start_f (me);
Array<Real> a;
SCM s;
- String type_str = grace_b ? "grace-" : "";
- s = scm_eval2 (ly_symbol2scm ((type_str + "beamed-stem-minimum-length").ch_C()), SCM_EOL);
+ s = me->get_elt_property("beamed-minimum-lengths");
a.clear ();
for (SCM q = s; q != SCM_EOL; q = gh_cdr (q))
a.push (gh_scm2double (gh_car (q)));
Real minimum_length = a[multiplicity <? (a.size () - 1)] * staff_space;
- s = scm_eval2 (ly_symbol2scm ((type_str + "beamed-stem-length").ch_C()),
- SCM_EOL);
+ s = me->get_elt_property ("beamed-lengths");
a.clear();
for (SCM q = s; q != SCM_EOL; q = gh_cdr (q))
if (r->style_str_.length_i ())
text->set_elt_property ("style", ly_str02scm (r->style_str_.ch_C()));
-
- /*
- Text is empty by default, which means that the only condition
- for not setting 'no-spacing-rods' should be: boolean && true.
-
- Anyway, non-empty text has been broken for some time now.
- */
-
- /// URG this is broken by basicTextScriptProperties which defines
- /// no-spacing-rods
- /// FIXME
SCM nonempty = get_property ("textNonEmpty");
- if (!to_boolean (nonempty))
+ if (to_boolean (nonempty))
/*
empty text: signal that no rods should be applied.
*/
- text->set_elt_property ("no-spacing-rods" , SCM_BOOL_T);
-
+ text->set_elt_property ("no-spacing-rods" , SCM_BOOL_F);
announce_element (text, r);
texts_.push (text);
basicNoteHeadProperties \push #'font-size = #-1
basicStemProperties \push #'font-size = #-1
+ basicStemProperties \push #'stem-shorten = #'(0)
basicBeamProperties \push #'font-size = #-1
basicTextScriptProperties \push #'font-size = #-1
basicSlurProperties \push #'font-size = #-1
basicLocalKeyProperties \push #'font-size = #-1
basicBeamProperties \push #'beam-thickness = #0.3
basicBeamProperties \push #'beam-space-function = #(lambda (x) 0.5)
-
+
+ basicStemProperties \push #'lengths = #(map (lambda (x) (* 0.8 x)) '(3.5 3.5 3.5 4.5 5.0))
+ basicStemProperties \push #'beamed-lengths =
+ #'(0.0 2.5 2.0 1.5)
+ basicStemProperties \push #'minimum-beamed-lengths
+ = #(map (lambda (x) (* 0.8 x)) '(0.0 2.5 2.0 1.5))
+
weAreGraceContext = ##t
graceAccidentalSpace= 1.5 ; % in staff space
}
\consists "Output_property_engraver";
\consists "System_start_delimiter_engraver";
systemStartDelimiterGlyph = #'bracket
-
-
-
-
-
\name StaffGroup;
\accepts "Staff";
\accepts "RhythmicStaff";
(before-line-breaking-callback . ,Script_column::before_line_breaking)
(name . "script column")
)
- basicSlurProperties = #`(
- (interfaces . (slur-interface))
- (molecule-callback . ,Slur::brew_molecule)
- (thickness . 1.2)
- (spacing-procedure . ,Slur::set_spacing_rods)
- (minimum-length . 1.5)
- (after-line-breaking-callback . ,Slur::after_line_breaking)
-
- (de-uglify-parameters . ( 1.5 0.8 -2.0))
- (details . ((height-limit . 2.0) (ratio . 0.333) (force-blowfit . 0.5) (beautiful . 0.5)))
- (y-free . 0.75)
- (name . "slur")
- )
+ basicSlurProperties = #default-basic-slur-properties
basicSpacingSpannerProperties =#`(
(spacing-procedure . ,Spacing_spanner::set_springs)
(before-line-breaking-callback . ,Stem::before_line_breaking)
(molecule-callback . ,Stem::brew_molecule)
(thickness . 0.8)
+ (beamed-lengths . (0.0 2.5 2.0 1.5))
+ (beamed-minimum-lengths . (0.0 1.5 1.25 1.0))
+
+;; Stems in unnatural (forced) direction should be shortened,
+;; according to [Roush & Gourlay]. Their suggestion to knock off
+;; a whole staffspace seems a bit drastical: we'll do half.
+ (lengths . (3.5 3.5 3.5 4.5 5.0))
+ (stem-shorten . (0.5))
; if stem is on middle line, choose this direction.
(default-neutral-direction . 1)
(name . "stem")
\version "1.3.59";
-%hmm, (these) abbrevs suck, imo
-% i guess they're meant as some form of doco
-% that's what i use them for...
+%{
stemup = \property Voice.verticalDirection = \up
stemboth= \property Voice.verticalDirection = \center
stemdown = \property Voice.verticalDirection = \down
+%}
+
+stemup = \property Voice.basicStemProperties \push #'direction = #1
+stemdown = \property Voice.basicStemProperties \push #'direction = #-1
+stemboth= \property basicStemProperties \pop #'direction
slurup = \property Voice.slurVerticalDirection = \up
slurboth = \property Voice.slurVerticalDirection = \center
Begin3
Title: LilyPond
-Version: 1.3.89
-Entered-date: 23SEP00
+Version: 1.3.90
+Entered-date: 24SEP00
Description:
Keywords: music notation typesetting midi fonts engraving
Author: hanwen@cs.uu.nl (Han-Wen Nienhuys)
janneke@gnu.org (Jan Nieuwenhuizen)
Maintained-by: hanwen@stack.nl (Han-Wen Nienhuys)
Primary-site: sunsite.unc.edu /pub/Linux/apps/sound/convert
- 1000k lilypond-1.3.89.tar.gz
+ 1000k lilypond-1.3.90.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.3.89.tar.gz
+ 1000k lilypond-1.3.90.tar.gz
Copying-policy: GPL
End
Name: lilypond
-Version: 1.3.89
+Version: 1.3.90
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.89.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.90.tar.gz
Summary: A program for printing sheet music.
URL: http://www.cs.uu.nl/~hanwen/lilypond
# Icon: lilypond-icon.gif
d,8( a' d f a d f d a f d )a
}
-accompany = \notes \relative c{
+accompany = \notes \relative c {
% snapnie, hoevaak relative c heeft ze nodig?
- \notes\relative c \basloopje
- \notes\relative c \basloopje
- \notes\relative c \basloopje
- \transpose bes \notes\relative c{ \basloopje }
- \transpose bes \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \transpose bes \notes\relative c{ \basloopje }
- \transpose bes \notes\relative c{ \basloopje }
- \transpose a \notes\relative c{ \basloopje }
- \transpose bes \notes\relative c{ \basloopje }
- \transpose a \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \notes\relative c \basloopje
+ \basloopje
+ \basloopje
+ \basloopje
+ \transpose bes \basloopje
+ \transpose bes \basloopje
+ \basloopje
+ \transpose bes \basloopje
+ \transpose bes \basloopje
+ \transpose a \basloopje
+ \transpose bes \basloopje
+ \transpose a \basloopje
+ \basloopje
+ \basloopje
% huh? d'
- \transpose d' \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \notes\relative c \basloopje
- \transpose d' \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \notes\relative c \basloopje
- \transpose e' \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \notes\relative c \basloopje
- \transpose bes \notes\relative c{ \basloopje }
- \transpose a \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \notes\relative c \basloopje
- \transpose d' \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \transpose d' \notes\relative c{ \basloopje }
- \notes\relative c \basloopje
- \notes\relative c \basloopje
- \transpose e' \notes\relative c{ \basloopje }
+ \transpose d' \basloopje
+ \basloopje
+ \basloopje
+ \transpose d' \basloopje
+ \basloopje
+ \basloopje
+ \transpose e' \basloopje
+ \basloopje
+ \basloopje
+ \transpose bes \basloopje
+ \transpose a \basloopje
+ \basloopje
+ \basloopje
+ \transpose d' \basloopje
+ \basloopje
+ \transpose d' \basloopje
+ \basloopje
+ \basloopje
+ \transpose e' \basloopje
< e1*6/4 b' e> ~ < e b' e>
}
\context Staff=up <
\global
\context Voice=foo {
- \property Voice.verticalDirection = #1
- \property Voice.scriptVerticalDirection = #1
+ \stemup
+ \property Voice.basicScriptProperties \push #'direction = #1
+
\melody
}
>
\context Staff=down <
\global
\clef bass;
- \autochange Staff \accompany
+ \autochange Staff \context Voice \accompany
>
>
(define mark-visibility end-of-line-invisible)
-; ugh: should calculate from beam-thickness.
-; result in staff-space
-;beam_thickness = 0.52 * (\staffspace - \stafflinethickness);
-;interbeam = (2.0 * \staffspace + \stafflinethickness - \beam_thickness) / 2.0;
-;interbeam4 = (3.0 * \staffspace - \beam_thickness) / 3.0;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+; BEAMS
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define (default-beam-space-function multiplicity)
(if (<= multiplicity 3) 0.816 0.844)
))
+; This is a mess : global namespace pollution. We should wait
+; till guile has proper toplevel environment support.
+
+
+;; Beams should be prevented to conflict with the stafflines,
+;; especially at small slopes
+;; ----------------------------------------------------------
+;; ########
+;; ########
+;; ########
+;; --------------########------------------------------------
+;; ########
+;;
+;; hang straddle sit inter hang
+
+;; inter seems to be a modern quirk, we don't use that
+
+
+;; Note: quanting period is take as quants.top () - quants[0],
+;; which should be 1 (== 1 interline)
+(define (mean a b) (* 0.5 (+ a b)))
+(define (default-beam-dy-quants beam stafflinethick)
+ (let ((thick (ly-get-elt-property beam 'thickness))
+ )
+
+ (list 0 (mean thick stafflinethick) (+ thick stafflinethick) 1)
+ ))
+
+;; two popular veritcal beam quantings
+;; see params.ly: #'beam-vertical-quants
+
+; (todo: merge these 2 funcs ? )
+
+(define (default-beam-y-quants beam multiplicity dy staff-line)
+ (let* ((beam-straddle 0)
+ (thick (ly-get-elt-property beam 'thickness))
+ (beam-sit (/ (+ thick staff-line) 2))
+ (beam-hang (- 1 (/ (- thick staff-line) 2)))
+ (quants (list beam-hang))
+ )
+
+ (if (or (<= multiplicity 1) (>= (abs dy) (/ staff-line 2)))
+ (set! quants (cons beam-sit quants)))
+ (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2)))
+ (set! quants (cons beam-straddle quants)))
+ ;; period: 1 (interline)
+ (append quants (list (+ 1 (car quants))))))
+
+(define (beam-traditional-y-quants beam multiplicity dy staff-line)
+ (let* ((beam-straddle 0)
+ (thick (ly-get-elt-property beam 'thickness))
+ (beam-sit (/ (+ thick staff-line) 2))
+ (beam-hang (- 1 (/ (- thick staff-line) 2)))
+ (quants '())
+ )
+ (if (>= dy (/ staff-line -2))
+ (set! quants (cons beam-hang quants)))
+ (if (and (<= multiplicity 1) (<= dy (/ staff-line 2)))
+ (set! quants (cons beam-sit quants)))
+ (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2)))
+ (set! quants (cons beam-straddle quants)))
+ ;; period: 1 (interline)
+ (append quants (list (+ 1 (car quants))))))
+
+
+;; There are several ways to calculate the direction of a beam
+;;
+;; * majority: number count of up or down notes
+;; * mean : mean centre distance of all notes
+;; * median : mean centre distance weighted per note
+
+(define (dir-compare up down)
+ (sign (- up down)))
+
+;; arguments are in the form (up . down)
+(define (beam-dir-majority count total)
+ (dir-compare (car count) (cdr count)))
+
+(define (beam-dir-mean count total)
+ (dir-compare (car total) (cdr total)))
+
+(define (beam-dir-median count total)
+ (if (and (> (car count) 0)
+ (> (cdr count) 0))
+ (dir-compare (/ (car total) (car count)) (/ (cdr total) (cdr count)))
+ (dir-compare (car count) (cdr count))))
+
+
+
+;; [Ross] states that the majority of the notes dictates the
+;; direction (and not the mean of "center distance")
+;;
+;; But is that because it really looks better, or because he wants
+;; to provide some real simple hands-on rules?
+;;
+;; We have our doubts, so we simply provide all sensible alternatives.
+
+
+
+
+
+;; array index multiplicity, last if index>size
+;; beamed stems
+
+
+;; TODO
+;; - take #forced stems into account (now done in C++)?
+;; - take y-position of chord or beam into account
+
+;;;;;;;;;;;;;;;;;;;;;;;
+
+
+;
+; todo: clean this up a bit: the list is getting rather long.
+;
(define basic-beam-properties
`(
(interfaces . (beam-interface))
(molecule-callback . ,Beam::brew_molecule)
- (beam-thickness . 0.42) ; staff-space, should use stafflinethick?
+ (thickness . 0.42) ; in staff-space, should use stafflinethick?
(before-line-breaking-callback . ,Beam::before_line_breaking)
(after-line-breaking-callback . ,Beam::after_line_breaking)
(default-neutral-direction . 1)
+ (dir-function . ,beam-dir-majority)
+ (height-quants . ,default-beam-dy-quants)
+ (vertical-position-quant-function . ,default-beam-y-quants)
+ (beamed-stem-shorten . (0.5))
(outer-stem-length-limit . 0.2)
(slope-limit . 0.2)
- (beam-flag-width-function . ,default-beam-flag-width-function)
- (beam-space-function . ,default-beam-space-function)
+ (flag-width-function . ,default-beam-flag-width-function)
+ (space-function . ,default-beam-space-function)
(damping . 1)
- (name . "beam")
+ (name . "beam")
)
)
(define (sign x)
(if (= x 0)
1
- (inexact->exact (/ x (abs x)))))
+ (if (< x 0) -1 1)))
;;;; AsciiScript as
(define (as-scm action-name)
;;; All dimensions are measured in staff-spaces
-; This is a mess : global namespace pollution. We should wait
-; till guile has proper toplevel environment support.
-
-
-;; Beams should be prevented to conflict with the stafflines,
-;; especially at small slopes
-;; ----------------------------------------------------------
-;; ########
-;; ########
-;; ########
-;; --------------########------------------------------------
-;; ########
-;;
-;; hang straddle sit inter hang
-
-;; inter seems to be a modern quirk, we don't use that
-
-(define staff-line 0.10)
-(define beam-thickness (* 0.52 (- 1 staff-line)))
-(define beam-straddle 0)
-(define beam-sit (/ (+ beam-thickness staff-line) 2))
-(define beam-hang (- 1 (/ (- beam-thickness staff-line) 2)))
-
-;; Note: quanting period is take as quants.top () - quants[0],
-;; which should be 1 (== 1 interline)
-
-(define beam-normal-dy-quants
- (list 0 (/ (+ beam-thickness staff-line) 2) (+ beam-thickness staff-line) 1))
-
-;; two popular veritcal beam quantings
-;; see params.ly: #'beam-vertical-quants
-(define (beam-normal-y-quants multiplicity dy)
- (let ((quants (list beam-hang)))
- (if (or (<= multiplicity 1) (>= (abs dy) (/ staff-line 2)))
- (set! quants (cons beam-sit quants)))
- (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2)))
- (set! quants (cons beam-straddle quants)))
- ;; period: 1 (interline)
- (append quants (list (+ 1 (car quants))))))
-
-(define (beam-traditional-y-quants multiplicity dy)
- (let ((quants '()))
- (if (>= dy (/ staff-line -2))
- (set! quants (cons beam-hang quants)))
- (if (and (<= multiplicity 1) (<= dy (/ staff-line 2)))
- (set! quants (cons beam-sit quants)))
- (if (or (<= multiplicity 2) (>= (abs dy) (/ staff-line 2)))
- (set! quants (cons beam-straddle quants)))
- ;; period: 1 (interline)
- (append quants (list (+ 1 (car quants))))))
-
-
-;; There are several ways to calculate the direction of a beam
-;;
-;; * majority: number count of up or down notes
-;; * mean : mean centre distance of all notes
-;; * median : mean centre distance weighted per note
-
-(define (dir-compare up down)
- (if (= up down)
- 0
- (if (> up down)
- 1
- -1)))
-
-;; (up . down)
-(define (beam-dir-majority count total)
- (dir-compare (car count) (cdr count)))
-
-(define (beam-dir-mean count total)
- (dir-compare (car total) (cdr total)))
-
-(define (beam-dir-median count total)
- (if (and (> (car count) 0)
- (> (cdr count) 0))
- (dir-compare (/ (car total) (car count)) (/ (cdr total) (cdr count)))
- (dir-compare (car count) (cdr count))))
-
-
-;;; Default variables and settings
-
-(define beam-height-quants beam-normal-dy-quants)
-(define beam-vertical-position-quants beam-normal-y-quants)
-
-
-;; [Ross] states that the majority of the notes dictates the
-;; direction (and not the mean of "center distance")
-;;
-;; But is that because it really looks better, or because he wants
-;; to provide some real simple hands-on rules?
-;;
-;; We have our doubts, so we simply provide all sensible alternatives.
-(define beam-dir-algorithm beam-dir-majority)
-
-
-;; array index flag-2 (what a name!!), last if index>size
-;; unbeamed stems
-(define stem-length '(3.5 3.5 3.5 4.5 5.0))
-(define grace-length-factor 0.8)
-(define grace-stem-length
- (map (lambda (x) (* grace-length-factor x)) stem-length))
-
-;; array index multiplicity, last if index>size
-;; beamed stems
-(define beamed-stem-shorten '(0.5))
-(define beamed-stem-length '(0.0 2.5 2.0 1.5))
-(define grace-beamed-stem-length '(0.0 2.5 2.0 1.5))
-(define beamed-stem-minimum-length '(0.0 1.5 1.25 1.0))
-(define grace-beamed-stem-minimum-length
- (map (lambda (x) (* grace-length-factor x)) beamed-stem-minimum-length))
-
-;; Stems in unnatural (forced) direction should be shortened,
-;; according to [Roush & Gourlay]. Their suggestion to knock off
-;; a whole staffspace seems a bit drastical: we'll do half.
-
-;; TODO
-;; - take #forced stems into account (now done in C++)?
-;; - take y-position of chord or beam into account
-
-(define stem-shorten '(0.5))
-(define grace-stem-shorten '(0.0))
-
;; 'head 'along-side-stem 'stem 'loose-end
;;
-(define slur-extremity-rules
+(define default-slur-extremity-rules
(list
;; (cons (lambda (slur dir) (begin (display "before sanity check") (newline))#f) #f)
;; head: Default position is centered in X, on outer side of head Y
;; along-side-stem: Default position is on stem X, on outer side of head Y
;; stem: Default position is on stem X, at stem end Y
-(define slur-extremity-offset-alist
+(define default-slur-extremity-offset-alist
'(
((head 1 1) . (-0.25 . 0.25))
((head 1 -1) . (-0.25 . -0.25))
((loose-end -1 -1) . (-4 . 0))
((loose-end -1 1) . (-4 . 0))
))
+
+
+(define default-basic-slur-properties
+ `(
+ (interfaces . (slur-interface))
+ (molecule-callback . ,Slur::brew_molecule)
+ (thickness . 1.2)
+ (spacing-procedure . ,Slur::set_spacing_rods)
+ (minimum-length . 1.5)
+ (after-line-breaking-callback . ,Slur::after_line_breaking)
+ (extremity-rules . ,default-slur-extremity-rules)
+ (extremity-offset-alist . ,default-slur-extremity-offset-alist)
+ (de-uglify-parameters . ( 1.5 0.8 -2.0))
+ (details . ((height-limit . 2.0) (ratio . 0.333) (force-blowfit . 0.5) (beautiful . 0.5)))
+ (y-free . 0.75)
+ (name . "slur")
+ )
+ )