-pl 14.hwn1jcn1
- - chord-name uses scm members
- - bfs: knee with different mults, interstaff knee, auto-knee
-
pl 14.hwn1
- specialize duration.cc for lily, move out of lib/
- stem cleanup
The website is the most convenient form to use for reading the
documentation on-line documentation. It is made by entering
- make website
+ make htmldoc
This does require a functioning LilyPond. The binary doesn't have
to be installed.
. * acc at tied note after linebreak.
. * fix font-naming and selecting
. * sparse ties.
+. *
+- in the melody contex I have:
+
+ d8 d, d' <d f> d, <d' f> |
+
+- in the bass context I have:
+
+
+ r8 d4. d4 |
+
+The problem is with 3rd note from melody / 2nd note from the bass.
+lilypond prints them as 2 separate notes, while the original score uses
+the same note circle, and draws both up and down stems. Like for the 5th
+melody / 3rd bass note. Is there any way to solve this ? It looks like
+lilypond doesn't like that the bass note is "4." If I make it "4", then
+lilypond will draw it like I want.
+
+Also, another problem is the midi output. Those bass notes are doubled.
+Is there any way to mute one of "them" ?
+
+Probably this is not a problem with lilypond, but with my lack of
+knowledge of music theory and/or lilypond. Anyhow, any help is highly
+appreciated, like always :-)
. * chord tonic: placement of accidental C#, Cb (from scm and C++)
. * note head on stem err msg in dutch.
. * why need to run -C mf twice?
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=3
-PATCH_LEVEL=14
-MY_PATCH_LEVEL=hwn1jcn1
+PATCH_LEVEL=15
+MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
+++ /dev/null
-
-\score {
- \notes \context PianoStaff <
- \context Staff = "up" {
- \autochange Staff \relative c' {
- [c8 e'] [c' c,,]
- \stemdown
- c'8 c c g,
- g8 d' d d
- \stemup
- b8 c d e
- }
- }
- \context Staff = "down" {
- \clef bass;
- s1*2
- }
- >
- \paper{
- \translator{
- \StaffContext
- autoKneeGap = #13.0
- autoInterstaffKneeGap = #4.0
- }
- }
-}
\score {
- \context Staff \notes\relative c'{
-% \property Voice.autoKneeGap = #13
- [c8 e'] [c' c,,]
- }
+ \notes \context PianoStaff <
+ \context Staff = "up" {
+ \autochange Staff \relative c' {
+ [c8 e'] [c' c,,]
+ \stemdown
+ c'8 c c g,
+ g8 d' d d
+ \stemup
+ b8 c d e
+ }
+ }
+ \context Staff = "down" {
+ \clef bass;
+ s1*2
+ }
+ >
\paper{
\translator{
\StaffContext
- autoKneeGap = #13
+ autoKneeGap = "13.0";
+ autoInterstaffKneeGap = "4.0";
}
}
}
{
bool is_b = (bool)(calc_interstaff_dist (stem (i), this)
- calc_interstaff_dist (stem (i-1), this));
- int l_y = (int)(stem (i-1)->head_positions()[get_direction ()])
+ int l_y = (int)(stem (i-1)->chord_start_f ())
+ (int)calc_interstaff_dist (stem (i-1), this);
- int r_y = (int)(stem (i)->head_positions()[get_direction ()])
+ int r_y = (int)(stem (i)->chord_start_f ())
+ (int)calc_interstaff_dist (stem (i), this);
int gap_i = r_y - l_y;
{
for (int i=0; i < stem_count (); i++)
{
- int y = (int)(stem (i)->head_positions()[get_direction ()])
+ int y = (int)(stem (i)->chord_start_f ())
+ (int)calc_interstaff_dist (stem (i), this);
stem (i)->set_direction (y < knee_y ? UP : DOWN);
stem (i)->set_elt_property ("dir-forced", SCM_BOOL_T);
set_stem_length (y, dy);
y_shift = check_stem_length_f (y, dy);
- Staff_symbol_referencer_interface st (this);
- Real half_space = st.staff_space () / 2;
- if (y_shift > half_space / 4)
+ Real internote_f = paper_l ()->get_var ("interline") / 2;
+ if (y_shift > internote_f / 4)
{
y += y_shift;
request quanting the other way.
*/
int quant_dir = 0;
- if (abs (y_shift) > half_space / 2)
+ if (abs (y_shift) > internote_f / 2)
quant_dir = sign (y_shift) * get_direction ();
y = quantise_y_f (y, dy, quant_dir);
set_stem_length (y, dy);
Real
Beam::calc_stem_y_f (Stem* s, Real y, Real dy) const
{
- Real thick = gh_scm2double (get_elt_property ("beam-thickness"));
- int beam_multiplicity = get_multiplicity ();
- int stem_multiplicity = (s->flag_i () - 2) >? 0;
+ Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));
+ int multiplicity = get_multiplicity ();
+
- Real interbeam_f = paper_l ()->interbeam_f (beam_multiplicity);
+ Real interbeam_f = paper_l ()->interbeam_f (multiplicity);
Real x0 = first_visible_stem ()->hpos_f ();
Real dx = last_visible_stem ()->hpos_f () - x0;
Real stem_y = (s->hpos_f () - x0) / dx * dy + y;
/* knee */
if (get_direction () != s->get_direction ())
{
- stem_y -= get_direction ()
- * (thick / 2 + (beam_multiplicity - 1 - stem_multiplicity))
- * interbeam_f;
+ stem_y -= get_direction () * (beam_f / 2
+ + (multiplicity - 1) * interbeam_f);
Staff_symbol_referencer_interface me (s);
Staff_symbol_referencer_interface last (last_visible_stem ());
if ((s != first_visible_stem ())
&& me.staff_symbol_l () != last.staff_symbol_l ())
stem_y += get_direction ()
- * (beam_multiplicity - stem_multiplicity) * interbeam_f;
+ * (multiplicity - (s->flag_i () - 2) >? 0) * interbeam_f;
}
return stem_y;
}
void
Beam::set_stem_length (Real y, Real dy)
{
- Staff_symbol_referencer_interface st (this);
- Real half_space = st.staff_space ()/2;
+ Real internote_f = paper_l ()->get_var ("interline") / 2;
for (int i=0; i < stem_count (); i++)
{
Stem* s = stem (i);
Real stem_y = calc_stem_y_f (s, y, dy);
/* caution: stem measures in staff-positions */
- s->set_stemend ((stem_y + calc_interstaff_dist (s, this)) / half_space);
+ s->set_stemend ((stem_y - calc_interstaff_dist (s, this)) / internote_f);
}
}
[Ross] (simplification of)
Try to set dy complying with:
- zero
- - thick / 2 + staffline_f / 2
- - thick + staffline_f
- + n * staff_space
+ - beam_f / 2 + staffline_f / 2
+ - beam_f + staffline_f
+ + n * interline
TODO: get allowed-positions as scm list (aarg: from paper block)
*/
return dy;
Staff_symbol_referencer_interface st (this);
- Real staff_space = st.staff_space ();
+ Real interline_f = st.staff_space ();
Real staffline_f = paper_l ()->get_var ("stafflinethickness");
- Real thick = gh_scm2double (get_elt_property ("beam-thickness"));;
+ Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
Array<Real> allowed_fraction (3);
allowed_fraction[0] = 0;
- allowed_fraction[1] = (thick / 2 + staffline_f / 2);
- allowed_fraction[2] = (thick + staffline_f);
+ allowed_fraction[1] = (beam_f / 2 + staffline_f / 2);
+ allowed_fraction[2] = (beam_f + staffline_f);
- allowed_fraction.push (staff_space);
+ allowed_fraction.push (interline_f);
Interval iv = quantise_iv (allowed_fraction, abs (dy));
Real q = (abs (dy) - iv[SMALLER] <= iv[BIGGER] - abs (dy))
? iv[SMALLER]
hang straddle sit inter hang
*/
- Staff_symbol_referencer_interface st (this);
- Real staff_space = st.staff_space ();
+ Staff_symbol_referencer_interface sinf (this);
+ Real space = sinf.staff_space ();
Real staffline_f = paper_l ()->get_var ("stafflinethickness");
- Real thick = gh_scm2double (get_elt_property ("beam-thickness"));;
+ Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
Real straddle = 0;
- Real sit = thick / 2 - staffline_f / 2;
- Real hang = staff_space - thick / 2 + staffline_f / 2;
+ Real sit = beam_f / 2 - staffline_f / 2;
+ Real hang = space - beam_f / 2 + staffline_f / 2;
/*
Put all allowed positions into an array.
allowed_position.push (hang);
}
- allowed_position.push (staff_space);
+ allowed_position.push (space);
Real up_y = get_direction () * y;
Interval iv = quantise_iv (allowed_position, up_y);
Real interbeam_f = paper_l ()->interbeam_f (multiplicity);
- Real thick = gh_scm2double (get_elt_property ("beam-thickness"));;
+ Real beam_f = gh_scm2double (get_elt_property ("beam-thickness"));;
Real dy = interbeam_f;
Real stemdx = staffline_f;
w = w/2 <? nw_f;
Molecule a;
if (lhalfs) // generates warnings if not
- a = lookup_l ()->beam (dydx, w, thick);
+ a = lookup_l ()->beam (dydx, w, beam_f);
a.translate (Offset (-w, -w * dydx));
for (int j = 0; j < lhalfs; j++)
{
int rwholebeams= here->beam_count (RIGHT) <? next->beam_count (LEFT) ;
Real w = next->hpos_f () - here->hpos_f ();
- Molecule a = lookup_l ()->beam (dydx, w + stemdx, thick);
+ Molecule a = lookup_l ()->beam (dydx, w + stemdx, beam_f);
a.translate_axis( - stemdx/2, X_AXIS);
int j = 0;
Real gap_f = 0;
// TODO: notehead widths differ for different types
gap_f = nw_f / 2;
w -= 2 * gap_f;
- a = lookup_l ()->beam (dydx, w + stemdx, thick);
+ a = lookup_l ()->beam (dydx, w + stemdx, beam_f);
}
for (; j < rwholebeams; j++)
w = w/2 <? nw_f;
if (rhalfs)
- a = lookup_l ()->beam (dydx, w, thick);
+ a = lookup_l ()->beam (dydx, w, beam_f);
for (; j < rwholebeams + rhalfs; j++)
{
beams_i_drul_[RIGHT] = i;
}
-const int infinity_i = 1000; // guh.
+const int infinity_i = INT_MAX; // guh.
int
Beaming_info_list::min_denominator_index () const
if (gh_boolean_p (chord_inversion))
find_inversion_b = gh_scm2bool (chord_inversion);
- chord_name_p_ = new Chord_name;
- chord_name_p_->set (to_chord (pitch_arr_, tonic_req_, inversion_req_, bass_req_, find_inversion_b));
+ chord_name_p_ = new Chord_name (to_chord (pitch_arr_, tonic_req_, inversion_req_, bass_req_, find_inversion_b));
announce_element (Score_element_info (chord_name_p_, 0));
}
#include "lookup.hh"
SCM
-to_scm (Musical_pitch p)
+pitch2scm (Musical_pitch p)
{
- return gh_list (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_), gh_int2scm (p.octave_i_), SCM_UNDEFINED);
-}
-
-Musical_pitch
-from_scm (SCM s)
-{
- return Musical_pitch (gh_scm2int (gh_car (s)),
- gh_scm2int (gh_cadr (s)),
- gh_scm2int (gh_caddr (s)));
-}
-
-template<class T>SCM
-array_to_scm (Array<T> arr)
-{
- SCM list = SCM_EOL;
- for (int i = arr.size (); i--;)
- list = gh_cons (to_scm (arr[i]), list);
- return list;
-}
-
-/*
- Silly templates
- Array<T> scm_to_array (SCM s)
- */
-template<class T>void
-scm_to_array (SCM s, Array<T>* arr)
-{
- for (; gh_pair_p (s); s= gh_cdr (s))
- arr->push (from_scm (gh_car (s)));
-}
-
-/*
- ugh, move to chord-name-engraver
-
- Hmm, why not represent complete chord as list?
- ((tonic third fifth) (inversion bass))
- */
-void
-Chord_name::set (Chord const& c)
-{
- set_elt_property ("pitches", array_to_scm (c.pitch_arr_));
- if (c.inversion_b_)
- set_elt_property ("inversion", to_scm (c.inversion_pitch_));
- if (c.bass_b_)
- set_elt_property ("bass", to_scm (c.bass_pitch_));
+ return gh_cons (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_));
}
-SCM
-notename2scm (Musical_pitch p)
+Chord_name::Chord_name (Chord const& c)
{
- return gh_cons (gh_int2scm (p.notename_i_), gh_int2scm (p.accidental_i_));
+ chord_ = c;
}
/*
Molecule
Chord_name::pitch2molecule (Musical_pitch p) const
{
- SCM name = scm_eval (gh_list (ly_symbol2scm ("user-pitch-name"), ly_quote_scm (notename2scm (p)), SCM_UNDEFINED));
+ SCM name = scm_eval (gh_list (ly_symbol2scm ("user-pitch-name"), ly_quote_scm (pitch2scm (p)), SCM_UNDEFINED));
if (name != SCM_UNSPECIFIED)
{
Chord::rebuild_transpose (&chord_type, diff_pitch (pitch_arr[0], Musical_pitch (0)), false);
for (int i= chord_type.size (); i--; )
- chord = gh_cons (notename2scm (chord_type[i]), chord);
+ chord = gh_cons (pitch2scm (chord_type[i]), chord);
SCM name = scm_eval (gh_list (ly_symbol2scm ("user-chord-name"), ly_quote_scm (chord), SCM_UNDEFINED));
if (gh_pair_p (name))
scale.push (Musical_pitch (i));
Musical_pitch tonic = pitch_arr[0];
- Chord::rebuild_transpose (&scale, tonic, true);
+ chord_.rebuild_transpose (&scale, tonic, true);
/*
Does chord include this step? -1 if flat
}
}
-/*
- TODO:
- fix silly to-and-fro scm conversions
- */
Molecule*
Chord_name::do_brew_molecule_p () const
{
- Array<Musical_pitch> pitch_arr;
- scm_to_array (get_elt_property ("pitches"), &pitch_arr);
- Musical_pitch tonic = pitch_arr[0];
+ Musical_pitch tonic = chord_.pitch_arr_[0];
Chord_mol name;
name.tonic_mol = pitch2molecule (tonic);
maybe we should check all sub-lists of pitches, not
just full list and base triad?
*/
- if (!user_chord_name (pitch_arr, &name))
+ if (!user_chord_name (chord_.pitch_arr_, &name))
{
/*
else, check if user has listed base triad
use user base name and add banter for remaining part
*/
- if ((pitch_arr.size () > 2)
- && user_chord_name (pitch_arr.slice (0, 3), &name))
+ if ((chord_.pitch_arr_.size () > 2)
+ && user_chord_name (chord_.pitch_arr_.slice (0, 3), &name))
{
Array<Musical_pitch> base = Chord::base_arr (tonic);
- base.concat (pitch_arr.slice (3, pitch_arr.size ()));
+ base.concat (chord_.pitch_arr_.slice (3, chord_.pitch_arr_.size ()));
banter (base, &name);
}
/*
*/
else
{
- banter (pitch_arr, &name);
+ banter (chord_.pitch_arr_, &name);
}
}
- SCM s = get_elt_property ("inversion");
- if (s != SCM_UNDEFINED)
+ if (chord_.inversion_b_)
{
name.inversion_mol = lookup_l ()->text ("", "/", paper_l ());
- Molecule mol = pitch2molecule (from_scm (s));
+ // zucht const&
+ Molecule mol = pitch2molecule (chord_.inversion_pitch_);
name.inversion_mol.add_at_edge (X_AXIS, RIGHT, mol, 0);
}
- s = get_elt_property ("bass");
- if (s != SCM_UNDEFINED)
+ if (chord_.bass_b_)
{
name.bass_mol = lookup_l ()->text ("", "/", paper_l ());
- Molecule mol = pitch2molecule (from_scm (s));
+ Molecule mol = pitch2molecule (chord_.bass_pitch_);
name.bass_mol.add_at_edge (X_AXIS, RIGHT, mol, 0);
}
void
Duration::compress (Rational m)
{
- tuplet_type_i_ *= m.num_i ();
- tuplet_iso_i_ *= m.den_i ();
+ tuplet_iso_i_ *= m.num_i ();
+ tuplet_type_i_ *= m.den_i ();
}
Rational
bool user_chord_name (Array<Musical_pitch> pitch_arr, Chord_mol* name_p) const;
void banter (Array<Musical_pitch> pitch_arr, Chord_mol* name_p) const;
- void set (Chord const& c);
+ Chord_name (Chord const& c);
+
+ /*
+ ugh. Junkme, I must be elt property.
+ */
+
+ Chord chord_;
protected:
virtual Molecule* do_brew_molecule_p () const;
+++ /dev/null
-/*
- plet.hh -- declare Plet
-
- source file of the GNU LilyPond music typesetter
-
- (c) 1997--1999 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-*/
-
-
-#ifndef PLET_HH
-#define PLET_HH
-#include "rational.hh"
-
-/**
- The type and replacement value of a plet (triplet, quintuplet.) Conceptually the same as a rational, but 4/6 != 2/3.
-
- (plet)
- */
-struct Plet {
- Plet ();
- Rational mom () const;
- bool unit_b () const;
-};
-
-#endif // PLET_HH
return s;
}
-#if 0
SCM
array_to_list (SCM *a , int l)
{
}
return list;
}
-#endif
SCM
ly_warning (SCM str)
SCM
Score_element::handle_broken_smobs (SCM s, SCM criterion)
{
+ again:
+
+
Score_element *sc = unsmob_element ( s);
if (sc)
{
/*
UGH! breaks on circular lists.
*/
- gh_set_car_x (s, handle_broken_smobs (gh_car (s), criterion));
- gh_set_cdr_x (s, handle_broken_smobs (gh_cdr (s), criterion));
-
- SCM c = gh_cdr(s);
-
- // gh_list_p () is linear, this is O(1)
- bool list = gh_pair_p (c) || c == SCM_EOL;
+ SCM car = handle_broken_smobs (gh_car (s), criterion);
+ SCM cdr = gh_cdr (s);
- if (gh_car (s) == SCM_UNDEFINED && list)
- return c;
+ if (car == SCM_UNDEFINED
+ && (gh_pair_p (cdr) || cdr == SCM_EOL))
+ {
+ /*
+ This is tail-recursion, ie.
+
+ return handle_broken_smobs (cdr, criterion);
+
+ We don't want to rely on the compiler to do this. */
+ s = cdr;
+ goto again;
+ }
+
+ gh_set_car_x (s, car);
+ gh_set_cdr_x (s, handle_broken_smobs (cdr, criterion));
+ return s;
}
return s;
}
{
Stem * me = (Stem*) this;
len = get_default_stemlen ();
+
+ // FIXME: len != position
me->set_elt_property ("stem-end-position", gh_double2scm (len));
}
else
if (gh_number_p (s))
info.idealy_f_ -= gh_double2scm (s);
- Real interstaff_f = -beam_dir* calc_interstaff_dist (this, beam_l ());
+ Real interstaff_f = beam_dir* calc_interstaff_dist (this, beam_l ());
info.idealy_f_ += interstaff_f;
info.miny_f_ += interstaff_f;
Begin3
Title: LilyPond
-Version: 1.3.14
-Entered-date: 19DEC99
+Version: 1.3.15
+Entered-date: 20DEC99
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.14.tar.gz
+ 1000k lilypond-1.3.15.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.3.14.tar.gz
+ 1000k lilypond-1.3.15.tar.gz
Copying-policy: GPL
End
Name: lilypond
-Version: 1.3.14
+Version: 1.3.15
Release: 1
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.14.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.3.15.tar.gz
Summary: A program for printing sheet music.
URL: http://www.cs.uu.nl/~hanwen/lilypond
# get Packager from (undocumented?) ~/.rpmmacros!