* August S.Sigov <august@infran.ru> Russian translation
- * Rune Zedeler <rune@zedeler.dk> Drum notation
+ * Rune Zedeler <rune@zedeler.dk> Drum notation, beaming and
+ accidental fixes
-1.5.16.jcn1
+1.5.16.hjj2
===========
-* Some more random hacking at midi2ly.py.
+* Emacs-mode: Inserting tags
-1.5.16
-======
+* Enable python2.1/Python.h
+
+1.5.16.hwn1
+===========
+
+* Add unfold-repeats function (Rune Zedeler!) to standard init SCM file.
+
+* Bugfix: spacing is no longer confused by coupled clefs, where one of the
+clefs is loose, and the other not.
+
+* Robustness fix for Slur. Don't crash if attachment not set.
+
+* Arpeggios can now have arrows on the top or bottom to determine
+their direction. (MF code by Chris Jackson)
+
+* Symbol cache bugfix in system-start-delimiter.cc -- may switch
+symbol cache off for gcc 2.96?
+
+* MikTeX PDF detection bugfix (Mats Bengtsson)
+
+* Some more random hacking at midi2ly.py. (jcn1)
+
+* Inline unsmob_XXX functions. Speedup of 6% on wtk1-fugue2.
1.5.15.jcn1
===========
@item @email{august@@infran.ru, August S.Sigov}
Russian translation
@item @email{rune@@zedeler.dk, Rune Zedeler}
- Drum notation
+ Drum notation, beaming and accidental fixes
@end itemize
@bye
}
@end lilypond
+@subsection Unfolding repeats for MIDI output.
+
+@cindex expanding repeats
+
+See @file{input/test/unfold-all-repeats.ly}.
+
+
@refbugs
Notice that timing information is not remembered at the start of an
This command creates @code{Voice.Arpeggio} grobs. Cross staff arpeggios
are @code{PianoStaff.Arpeggio}.
+To add an arrow head to explicitly specify the direction of the
+arpeggio, you should set the arpeggio grob property
+@code{arpeggio-type}.
+
+@lilypond[fragment,relative,verbatim]
+ \context Voice {
+ \property Voice.Arpeggio \override #'arpeggio-direction = #1
+ <c\arpeggio e g c>
+ \property Voice.Arpeggio \override #'arpeggio-direction = #-1
+ <c\arpeggio e g c>
+ }
+@end lilypond
+
+@ignore
+A square bracket on the left indicates that the player should not
+arpeggiate the chord.
+
+@lil ypond[fragment,relative,verbatim]
+ \context PianoStaff <
+ \property PianoStaff.connectArpeggios = ##t
+ \property PianoStaff.Arpeggio \override #'arpeggio-direction = #'bracket
+ \context Voice = one { <c'\arpeggio e g c> }
+ \context Voice = other { \clef bass <c,,\arpeggio e g>}
+ >
+@ e nd lilypond
+@end ignore
+
+
@refbugs
It is not possible to mix connected arpeggios and unconnected arpeggios
PACKAGE_NAME=LilyPond
MAJOR_VERSION=1
MINOR_VERSION=5
-PATCH_LEVEL=16
-MY_PATCH_LEVEL=jcn1
+PATCH_LEVEL=17
+MY_PATCH_LEVEL=
# use the above to send patches: MY_PATCH_LEVEL is always empty for a
# released version.
/* define if you have kpse_find_tfm */
#define HAVE_KPSE_FIND_TFM 0
+/* define if you have python2.1/Python.h header */
+#define HAVE_PYTHON2_1_PYTHON_H 0
+
/* define if you have python2.0/Python.h header */
#define HAVE_PYTHON2_0_PYTHON_H 0
fi
-for ac_hdr in python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h
+for ac_hdr in python2.1/Python.h python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h
do
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
AC_PATH_PROG(PERL, perl, error)
-AC_HAVE_HEADERS(python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h)
+AC_HAVE_HEADERS(python2.1/Python.h python2.0/Python.h python2/Python.h python/Python.h python1.5/Python.h Python.h)
AC_STEPMAKE_END
Rational (int, int);
Rational (double);
Rational (Rational const&r) { copy (r);}
+ Rational &operator = (Rational const &r) {
+ copy (r); return *this;
+ }
- Rational &operator = (Rational const &);
Rational &operator *= (Rational);
Rational &operator /= (Rational);
Rational &operator += (Rational);
return (*this += r);
}
-/*
- be paranoid about overiding libg++ stuff
- */
-Rational &
-Rational::operator = (Rational const &r)
-{
- copy (r);
- return *this;
-}
-
String
Rational::str () const
{
--- /dev/null
+
+
+
+\version "1.4.8"
+\score { \notes
+ \context PianoStaff <
+ \context Staff = up { \clef G
+ c'2 ~ \translator Staff=down c'
+ }
+ \context Staff = down { \clef F
+ s1
+ }
+ >
+ \paper { }
+}
+
+
+
\context PianoStaff <
\context Staff=one \notes\relative c''{
\context Voice < fis,-\arpeggio d a >
+ \property Staff.Arpeggio \override #'arpeggio-direction = #1
+ \context Voice < fis,-\arpeggio d a >
%%\property PianoStaff.SpanArpeggio \override #'connect = ##t
\property PianoStaff.connectArpeggios = ##t
<fis,\arpeggio a c>
\context Staff=two \notes\relative c{
\clef bass
\context Voice < g b d-\arpeggio >
+ \property Staff.Arpeggio \override #'arpeggio-direction = #-1
+ \context Voice < g b d-\arpeggio >
<g\arpeggio b d>
}
>
--- /dev/null
+
+\header {
+texidoc = "The standard function unfold-repeats will recursively unfold
+all repeats for correct MIDI output. Thanks to Rune Zedeler."
+}
+
+
+mel = \notes \context Staff {
+ \repeat tremolo 8 {c'32 e' }
+ \repeat percent 2 { c''8 d'' }
+ \repeat volta 2 {c'4 d' e' f'}
+ \alternative {
+ { g' a' a' g' }
+ {f' e' d' c' }
+ }
+ \bar "|."
+}
+
+\score { \notes {
+ \mel \break
+ \apply #unfold-repeats \mel
+ }
+}
+
+
*/
return SCM_EOL;
}
+
+ Direction dir = CENTER;
+ if (isdir_b (me->get_grob_property ("arpeggio-direction")))
+ {
+ dir = to_dir (me->get_grob_property ("arpeggio-direction"));
+ }
Molecule mol;
- Molecule arpeggio = Font_interface::get_default_font (me)->find_by_name ("scripts-arpeggio");
+ Font_metric *fm =Font_interface::get_default_font (me);
+ Molecule squiggle = fm->find_by_name ("scripts-arpeggio");
+ Real arrow_space = (dir) ? Staff_symbol_referencer::staff_space (me) : 0.0;
+
Real y = heads[LEFT];
- while (y < heads[RIGHT])
+ while (y < heads[RIGHT] - arrow_space)
{
- mol.add_at_edge (Y_AXIS, UP,arpeggio, 0.0);
- y+= arpeggio. extent (Y_AXIS).length ();
+ mol.add_at_edge (Y_AXIS, UP,squiggle, 0.0);
+ y+= squiggle. extent (Y_AXIS).length ();
}
mol.translate_axis (heads[LEFT], Y_AXIS);
-
+ if (dir)
+ mol.add_at_edge (Y_AXIS, dir,
+ fm->find_by_name ("scripts-arpeggio-arrow-" + to_str (dir)), 0.0);
+
return mol.smobbed_copy () ;
}
IMPLEMENT_TYPE_P (Duration, "duration?");
-IMPLEMENT_UNSMOB (Duration, duration);
SCM
Duration::mark_smob (SCM)
}
-IMPLEMENT_UNSMOB (Font_metric, metrics);
+
IMPLEMENT_SMOBS (Font_metric);
IMPLEMENT_DEFAULT_EQUAL_P (Font_metric);
IMPLEMENT_TYPE_P (Font_metric, "font-metric?");
/*
Remove the value associated with KEY, and return it. The result is
- that a next call will yield SCM_UNDEFINED (and not the underlying
+ that a next call will yield SCM_EOL (and not the underlying
`basic' property.
*/
SCM
****************************************************/
-IMPLEMENT_UNSMOB (Grob, grob);
+
IMPLEMENT_SMOBS (Grob);
IMPLEMENT_DEFAULT_EQUAL_P (Grob);
#include "compare.hh"
INSTANTIATE_COMPARE (Duration, Duration::compare);
-Duration*unsmob_duration (SCM);
+DECLARE_UNSMOB(Duration,duration);
// int compare (Array<Duration>*, Array<Duration>*);
#endif // DURATION_HH
Font_metric ();
};
-Font_metric * unsmob_metrics (SCM s);
+DECLARE_UNSMOB(Font_metric, metrics);
#endif /* FONT_METRIC_HH */
DECLARE_SCHEME_CALLBACK (fixup_refpoint, (SCM));
};
-Grob * unsmob_grob (SCM);
+DECLARE_UNSMOB(Grob,grob);
#endif // STAFFELEM_HH
#include "input.hh"
#include "lily-guile.hh"
+#include "smobs.hh"
SCM make_input (Input spot);
-Input *unsmob_input (SCM);
+Input *unsmob_input(SCM);
extern Input dummy_input_global;
#include "smobs.hh"
-#define IMPLEMENT_UNSMOB(CL, name) \
-CL * \
-unsmob_ ## name ( SCM s) \
-{ \
-return CL::unsmob (s); \
-}
-
#define IMPLEMENT_TYPE_P(CL, FUNCNAME)\
void init_type_p_ ## CL ()\
{\
\
return s; \
} \
-CL * \
-CL::unsmob (SCM s) \
-{ \
- if (SCM_NIMP (s) && SCM_CELL_TYPE (s) == smob_tag_) \
- return (CL*) SCM_CELL_WORD_1 (s); \
- else \
- return 0; \
-} \
size_t \
CL::free_smob (SCM ses) \
{ \
DECLARE_SIMPLE_SMOBS (Syllable_group,);
} ;
-Syllable_group * unsmob_voice_entry (SCM);
+DECLARE_UNSMOB(Syllable_group,voice_entry);
#endif // LYRIC_PHRASING_ENGRAVER_HH
};
-Molecule *unsmob_molecule (SCM);
+DECLARE_UNSMOB(Molecule,molecule);
SCM fontify_atom (Font_metric*, SCM atom);
Molecule create_molecule (SCM brew_molecule);
ostream & operator << ( ostream &,Moment const &);
-Moment * unsmob_moment (SCM);
+DECLARE_UNSMOB(Moment,moment);
int compare (Moment const&,Moment const&);
INSTANTIATE_COMPARE (Moment const&, Moment::compare);
DECLARE_SMOBS (Music_output_def,);
};
-Music_output_def* unsmob_music_output_def (SCM);
+DECLARE_UNSMOB(Music_output_def,music_output_def);
#endif // Music_output_DEF_HH
};
-Music * unsmob_music (SCM);
+DECLARE_UNSMOB(Music,music);
#endif // MUSIC_HH
#ifndef SPACING_SPANNER_HH
#define SPACING_SPANNER_HH
-#include "spanner.hh"
-#include "spring.hh"
-
-class New_spacing_spanner
-{
-public:
- static void set_interface (Grob*);
- static void do_measure (Grob*,Link_array<Grob> *) ;
- static void stretch_to_regularity (Grob*, Array<Spring> *, Link_array<Grob> const &);
- static void breakable_column_spacing (Item* l, Item *r);
- DECLARE_SCHEME_CALLBACK (set_springs, (SCM ));
- static Real stem_dir_correction (Grob*,Grob*,Grob*) ;
- static Real default_bar_spacing (Grob*,Grob*,Grob*,Moment) ;
- static Real note_spacing (Grob*,Grob*,Grob*,Moment) ;
- static Real get_duration_space (Grob*,Moment dur, Moment shortest) ;
-};
-
-#endif /* SPACING_SPANNER_HH */
-
};
-Pitch* unsmob_pitch (SCM);
+DECLARE_UNSMOB(Pitch,pitch);
#include "compare.hh"
INSTANTIATE_COMPARE (Pitch, Pitch::compare);
private:
void run_translator (Music_output_def*);
};
-Score * unsmob_score (SCM);
+DECLARE_UNSMOB(Score,score);
#endif
static bool has_interface (Grob*);
static void find_musical_sequences (Grob*);
DECLARE_SCHEME_CALLBACK (set_spacing_rods, (SCM ));
+ DECLARE_SCHEME_CALLBACK (set_spacing_rods_and_seqs, (SCM ));
};
#endif /* SEPARATING_GROUP_SPANNER_HH */
static int print_smob (SCM s, SCM p, scm_print_state*); \
public: \
static SCM equal_p (SCM a, SCM b);\
- static CL * unsmob (SCM);\
+ static CL * unsmob (SCM s){\
+ if (SCM_NIMP (s) && SCM_CELL_TYPE (s) == smob_tag_) \
+ return (CL*) SCM_CELL_WORD_1 (s); \
+ else \
+ return 0; \
+} \
static SCM smob_p (SCM);\
static void init_smobs (); \
private:
SCM self_scm () const { return self_scm_; } \
private:
+#define DECLARE_UNSMOB(CL,name) \
+inline CL * \
+unsmob_ ## name (SCM s) \
+{ \
+return CL::unsmob (s); \
+}
+
+
#endif /* SMOBS_HH */
};
-Translator_def* unsmob_translator_def (SCM);
+DECLARE_UNSMOB(Translator_def,translator_def);
#endif /* TRANSLATOR_DEF_HH */
void add_translator (Translator*trans_p);
Translator*get_translator_l (String s);
-Translator *unsmob_translator (SCM);
+DECLARE_UNSMOB(Translator,translator);
#endif // TRANSLATOR_HH
IMPLEMENT_TYPE_P (Molecule, "molecule?");
IMPLEMENT_DEFAULT_EQUAL_P (Molecule);
-IMPLEMENT_UNSMOB (Molecule, molecule);
+
#include "warn.hh"
#include "ly-smobs.icc"
-IMPLEMENT_UNSMOB (Moment,moment);
+
IMPLEMENT_SIMPLE_SMOBS (Moment);
IMPLEMENT_TYPE_P (Moment, "moment?");
IMPLEMENT_SMOBS (Music_output_def);
-IMPLEMENT_UNSMOB (Music_output_def,music_output_def);
+
IMPLEMENT_DEFAULT_EQUAL_P (Music_output_def);
SCM
}
IMPLEMENT_TYPE_P (Music, "music?");
-IMPLEMENT_UNSMOB (Music,music);
+
IMPLEMENT_SMOBS (Music);
IMPLEMENT_DEFAULT_EQUAL_P (Music);
*/
-#include "new-spacing-spanner.hh"
#include "paper-column.hh"
#include "dimensions.hh"
#include "paper-def.hh"
#include "line-of-score.hh"
#include "misc.hh"
#include "separation-item.hh"
+#include "spanner.hh"
+#include "spring.hh"
+class New_spacing_spanner
+{
+public:
+ static void set_interface (Grob*);
+ static void do_measure (Grob*,Link_array<Grob> *) ;
+ static void stretch_to_regularity (Grob*, Array<Spring> *, Link_array<Grob> const &);
+ static void breakable_column_spacing (Item* l, Item *r);
+ DECLARE_SCHEME_CALLBACK (set_springs, (SCM ));
+ static Real stem_dir_correction (Grob*,Grob*,Grob*) ;
+ static Real default_bar_spacing (Grob*,Grob*,Grob*,Moment) ;
+ static Real note_spacing (Grob*,Grob*,Grob*,Moment) ;
+ static Real get_duration_space (Grob*,Moment dur, Moment shortest) ;
+ static void prune_loose_colunms (Link_array<Grob>*);
+};
void
New_spacing_spanner::set_interface (Grob*me)
me->set_extent_callback (SCM_EOL, Y_AXIS) ;
}
+/*
+ Remove all columns that are not tightly
+ fitting part of the spacing problem.
+ */
+void
+New_spacing_spanner::prune_loose_colunms (Link_array<Grob> *cols)
+{
+ for (int i = cols->size(); i--;)
+ {
+ SCM between = cols->elem(i)->get_grob_property ("between-cols");
+ if (!gh_pair_p (between))
+ continue;
+
+ Item * l = dynamic_cast<Item*> (unsmob_grob (gh_car (between)));
+ Item * r = dynamic_cast<Item*> (unsmob_grob (gh_cdr (between)));
+ if (l->column_l () != cols->elem (i-1)
+ || r->column_l () != cols->elem (i +1))
+ {
+ cols->del (i);
+ }
+ }
+}
+
/*
The algorithm is partly taken from :
Moment base_shortest_duration = *unsmob_moment (me->get_grob_property ("maximum-duration-for-spacing"));
shortest_in_measure.set_infinite (1);
- for (int i = cols->size(); i--;)
- {
- if (gh_pair_p (cols->elem(i)->get_grob_property ("between-cols")))
- cols->del (i);
- }
-
+ prune_loose_colunms (cols);
for (int i =0 ; i < cols->size (); i++)
{
IMPLEMENT_TYPE_P (Pitch, "pitch?");
-IMPLEMENT_UNSMOB (Pitch, pitch);
+
SCM
Pitch::mark_smob (SCM)
{
-IMPLEMENT_UNSMOB (Scheme_hash_table,scheme_hash);
+
IMPLEMENT_SMOBS (Scheme_hash_table);
IMPLEMENT_DEFAULT_EQUAL_P (Scheme_hash_table);
IMPLEMENT_SMOBS (Score);
IMPLEMENT_DEFAULT_EQUAL_P (Score);
-IMPLEMENT_UNSMOB (Score, score);
+
SCM
Score::mark_smob (SCM s)
}
}
+MAKE_SCHEME_CALLBACK (Separating_group_spanner,set_spacing_rods_and_seqs,1);
+SCM
+Separating_group_spanner::set_spacing_rods_and_seqs (SCM smob)
+{
+ set_spacing_rods (smob);
+ find_musical_sequences (unsmob_grob (smob));
+ return SCM_UNSPECIFIED;
+}
+
MAKE_SCHEME_CALLBACK (Separating_group_spanner,set_spacing_rods,1);
SCM
Separating_group_spanner::set_spacing_rods (SCM smob)
find_rods (rb, ly_cdr (s));
}
find_musical_sequences (me);
+
#if 0
/*
TODO; restore this.
&& lrank - rank == 1
&& llmus && !lmus && mus)
{
+ /*
+ these columns are adjacent, so set spacing-sequence in
+ IT.
+
+ Q Q+1 Q+2 (rank)
+ Note Clef Note
+
+ IT LAST LLAST
+
+ */
SCM seq = col->get_grob_property ("spacing-sequence");
col->set_grob_property ("spacing-sequence",
gh_cons (gh_cons (it->self_scm (), last->self_scm ()), seq));
+
+ /*
+ lcol can not be a loose column, so we make sure
+ that is and will not be marked as such.
+ */
+ lcol->set_grob_property ("between-cols" , SCM_BOOL_F);
}
else if (!lmus)
{
SCM between = lcol->get_grob_property ("between-cols");
+ if (between == SCM_BOOL_F)
+ continue;
+
if (!gh_pair_p (between))
{
between = gh_cons (it->self_scm (), llast->self_scm ());
Direction dir = LEFT;
do
{
- if (!gh_symbol_p (index_cell (me->get_grob_property ("attachment"), dir)))
+ SCM att = me->get_grob_property ("attachment");
+ /*
+ */
+ if (!gh_pair_p (att))
+ {
+ programming_error ("attachment is not a cons?!");
+ att = gh_cons (SCM_EOL, SCM_EOL);
+ me->set_grob_property ("attachment", att);
+ }
+
+ if (!gh_symbol_p (index_cell (att, dir)))
{
for (SCM s = me->get_grob_property ("extremity-rules");
s != SCM_EOL; s = ly_cdr (s))
gh_int2scm ((int)dir));
if (r != SCM_BOOL_F)
{
- index_set_cell (me->get_grob_property ("attachment"), dir,
+ index_set_cell (att, dir,
ly_cdar (s));
break;
}
me->set_extent_callback (SCM_EOL, Y_AXIS) ;
}
-#if 0
-struct Note_run
-{
- Array<int> idxes;
- int start, end;
- Moment duration;
- int count;
-};
-
-int
-column_compare (Grob *const &t1, Grob *const &t2)
-{
- return Moment::compare (Paper_column::when_mom (t1),
- Paper_column::when_mom (t2));
-}
-
-
-Note_run
-run_length (Moment dt, int i, Array<Moment> const &moms,
- Link_array<Note_run> runs)
-{
- int k = 0;
- Array<int> idxes;
-
- idxes.push (i);
- while (1)
- {
- Moment next = moms[i] + dt;
- while (i < moms.size () && moms[i] < next)
- i++;
- if (i == moms.size () || moms[i] != next)
- break;
-
- idxes.push (i);
- k++;
- }
-
- Moment dur = idxes.size ()
-}
-
-void
-find_runs (Grob*me, Link_array<Grob> cols)
-{
- Link_array<Grob> filter_cols;
- Array<Moment> col_moments;
- for (int i = 0; i < cols.size (); i++)
- {
- Moment w = Paper_column::when_mom (cols[i]);
-
- if (!w.grace_part_ && Paper_column::musical_b (cols[i]))
- {
- filter_cols.push (cols[i]);
- col_moments.push (w);
- }
- }
-
- Moment end_mom = col_moments.top ();
- for (int i = 0; i < col_moments.size () ; i++)
- {
- for (int j = i+1; j < col_moments.size (); j++)
- {
- Moment dt = Paper_column::col_momentsfilter_cols
- }
- }
-}
-#endif
-
/*
The algorithm is partly taken from :
return 1;
}
-IMPLEMENT_UNSMOB (Syllable_group, voice_entry);
+
IMPLEMENT_SIMPLE_SMOBS (Syllable_group);
IMPLEMENT_DEFAULT_EQUAL_P (Syllable_group);
name. This is better than using find_font directly,
esp. because that triggers mktextfm for non-existent
fonts. */
- SCM alist = scm_list_n (gh_cons (ly_symbol2scm ("font-family"),
- ly_symbol2scm ("braces")),
- gh_cons (ly_symbol2scm ("font-relative-size"),
- gh_int2scm (i)),
- SCM_UNDEFINED);
+ SCM br = ly_symbol2scm ("braces");
+ SCM fam = gh_cons (ly_symbol2scm ("font-family"), br);
+ SCM sz = gh_cons (ly_symbol2scm ("font-relative-size"), gh_int2scm (i));
+
+ SCM alist = scm_list_n (fam, sz, SCM_UNDEFINED);
fm = Font_interface::get_font (me, scm_list_n (alist, SCM_UNDEFINED));
/* Hmm, if lookup fails, we get cmr10 anyway */
if (ly_scm2string (ly_car (fm->description_)) == "cmr10")
return best_result;
}
-IMPLEMENT_UNSMOB (Translator_def,translator_def);
+
IMPLEMENT_SMOBS (Translator_def);
IMPLEMENT_DEFAULT_EQUAL_P (Translator_def);
return SCM_EOL;
}
-IMPLEMENT_UNSMOB (Translator, translator);
+
IMPLEMENT_SMOBS (Translator);
IMPLEMENT_DEFAULT_EQUAL_P (Translator);
;;;
;;; (c) 1999--2001 Jan Nieuwenhuizen <janneke@gnu.org>
;;;
-;;; Changed 29th Aug 2001 Heikki Junes <heikki.junes@hut.fi>
-;;; * Add PS-compilation, PS-viewing and MIDI-play
-;;; Changed 12th Sep 2001 Heikki Junes
-;;; * Keyboard shortcuts
+;;; Changed 2001 Heikki Junes <heikki.junes@hut.fi>
+;;; * Add PS-compilation, PS-viewing and MIDI-play (29th Aug 2001)
+;;; * Keyboard shortcuts (12th Sep 2001)
+;;; * Inserting tags, inspired on sgml-mode (11th Oct 2001)
;;; Inspired on auctex
(define-key LilyPond-mode-map "\C-c\C-v" 'LilyPond-command-view)
(define-key LilyPond-mode-map "\C-c\C-p" 'LilyPond-command-viewps)
(define-key LilyPond-mode-map "\C-c\C-m" 'LilyPond-command-midi)
+ (define-key LilyPond-mode-map "\C-cn" 'lilypond-notes)
+ (define-key LilyPond-mode-map "\C-cs" 'lilypond-score)
)
;;; Menu Support
+(define-skeleton lilypond-notes
+ "Lilypond notes tag."
+ nil
+; (if (bolp) nil ?\n)
+ "\\notes"
+ (if (y-or-n-p "Set \"\\relative\" attribute? ")
+ (concat " \\relative " (skeleton-read "Relative: " "" str)))
+ " { " _ " }")
+
+(define-skeleton lilypond-score
+ "Lilypond score tag."
+ nil
+ (if (bolp) nil ?\n)
+ "\\score {\n"
+ " " _ "\n"
+ " \\paper { }\n"
+ (if (y-or-n-p "Insert \"\\header\" field? ")
+ (concat " \\header {\n "
+ (skeleton-read "Piece: " "piece = " str) "\n"
+ (if (y-or-n-p "Insert \"opus\" field? ")
+ (concat " " (skeleton-read "Opus: " "opus = " str) "\n"))
+ " }\n"))
+ (if (y-or-n-p "Insert \"\\midi\" field? ")
+ (concat " \\midi { "
+ (skeleton-read "Midi: " "\\tempo 4 = " str)
+ " }\n"))
+ "}\n")
+
(defun LilyPond-command-menu-entry (entry)
;; Return LilyPond-command-alist ENTRY as a menu item.
(let ((name (car entry)))
[ "Region" LilyPond-command-select-region
:keys "C-c C-r" :style radio
:selected (eq LilyPond-command-current 'LilyPond-command-region) ]))
+ '(("Insert"
+ [ "\\notes..." lilypond-notes
+ :keys "C-c n" ]
+ [ "\\score..." lilypond-score
+ :keys "C-c s" ]
+ ))
; (let ((file 'LilyPond-command-on-current))
; (mapcar 'LilyPond-command-menu-entry LilyPond-command-alist))
;;; Some kind of mapping which includes :keys might be more elegant
'([ "View" (LilyPond-command (LilyPond-command-menu "View") 'LilyPond-master-file) :keys "C-c C-v"])
'([ "ViewPS" (LilyPond-command (LilyPond-command-menu "ViewPS") 'LilyPond-master-file) :keys "C-c C-p"])
'([ "Midi" (LilyPond-command (LilyPond-command-menu "Midi") 'LilyPond-master-file) :keys "C-c C-m"])
- ))
-
+ ))
(defconst LilyPond-imenu-generic-re "^\\([a-zA-Z_][a-zA-Z0-9_]*\\) *="
"Regexp matching Identifier definitions.")
% \consists "Repeat_engraver"
\consists "Volta_engraver"
\consists "Separating_line_group_engraver"
-
+ SeparatingGroupSpanner \override #'spacing-procedure
+ = #Separating_group_spanner::set_spacing_rods_and_seqs
\consists "Clef_engraver"
Begin3
Title: LilyPond
-Version: 1.5.16
-Entered-date: 09OKT01
+Version: 1.5.17
+Entered-date: 14OKT01
Description: @BLURB@
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.5.16.tar.gz
+ 1000k lilypond-1.5.17.tar.gz
Original-site: ftp.cs.uu.nl /pub/GNU/LilyPond/development/
- 1000k lilypond-1.5.16.tar.gz
+ 1000k lilypond-1.5.17.tar.gz
Copying-policy: GPL
End
%define name lilypond
-%define version 1.5.16
+%define version 1.5.17
%define release 1mdk
Name: %{name}
%define info yes
Name: lilypond
-Version: 1.5.16
+Version: 1.5.17
Release: 1
License: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.16.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.17.tar.gz
Summary: Create and print music notation
URL: http://www.lilypond.org/
BuildRoot: /tmp/lilypond-install
Distribution: SuSE Linux 7.0 (i386)
Name: lilypond
-Version: 1.5.16
+Version: 1.5.17
Release: 2
Copyright: GPL
Group: Applications/Publishing
-Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.16.tar.gz
+Source0: ftp.cs.uu.nl:/pub/GNU/LilyPond/development/lilypond-1.5.17.tar.gz
# music notation software for.. ?
Summary: A program for printing sheet music.
URL: http://www.lilypond.org/
currentpicture := currentpicture shifted (height/2, width/2);
fet_endchar;
+
+
+%
+% Arpeggio arrow by Chris Jackson <chris@fluffhouse.org.uk>
+%
+
+def draw_arpeggio_arrow =
+ save thinness, height, width, overshoot, se, sw, ne, nw, alpha;
+ pair ne, nw, se, sw;
+ height# = staff_space#;
+ width# = 0.8height#;
+ overshoot# = 0.25 staff_space#;
+ define_pixels (height,overshoot,width);
+ set_char_box(0, width#, 0, height#);
+ alpha := -40;
+ nw = dir (alpha+180);
+ sw = dir (alpha-90); se = dir alpha;
+
+ penpos1(rthin, alpha+90);
+ penpos2(5/4 rthick, alpha);
+ penpos3(5/4 rthick, 0);
+
+ z1 = (width/2, height) - overshoot*se; % numbering is consistent with the arpeggio symbol
+ z2 = 2[z4,(width/2,height/2)];
+ z3 = (0.5 width, 0.5 height);
+ z4 = (0.25 staff_space, rthin);
+ z6 = z2l + 1/2rthin*sw;
+ z9 = (width/2, height) + overshoot*se;
+ fill z1l {se}..{se} z6 .. z3l .. z3r.. z9{nw} ..{nw} z1r.. cycle;
+
+ bot z10 = ( 0.5w, 0 );
+ lft z11 = (-0.3w, 0.8h);
+ rt z12 = ( 1.3w, 0.8h);
+ pickup pencircle scaled 0.5 rthin;
+ filldraw z3 -- z12 {dir -130} .. {dir -110} z10 {dir 110} .. {dir 130} z11 -- cycle;
+enddef;
+
+fet_beginchar("Arpeggio arrow down", "arpeggio-arrow--1", "arpeggioarrowdown");
+ draw_arpeggio_arrow;
+fet_endchar;
+
+
+fet_beginchar("Arpeggio arrow up", "arpeggio-arrow-1", "arpeggioarrowup");
+ draw_arpeggio_arrow;
+ currentpicture := currentpicture scaled -1 shifted (0.8staff_space, staff_space);
+fet_endchar;
+
+
+
+
% Hmm
input feta-slag;
+
+
fet_endgroup("scripts");
/* urg */
#if HAVE_PYTHON2_PYTHON_H
#include <python2/Python.h>
+#elif HAVE_PYTHON2_1_PYTHON_H
+#include <python2.1/Python.h>
#elif HAVE_PYTHON2_0_PYTHON_H
#include <python2.0/Python.h>
#elif HAVE_PYTHON1_5_PYTHON_H
;;; Jan Nieuwenhuizen <janneke@gnu.org>
-(eval-string (ly-gulp-file "translator-description.scm"))
;; alist of translater descriptions
(define (document-translator-property sym)
(grob-property-description 'arch-width number? "width of the hook of a system brace.")
(grob-property-description 'arithmetic-basicspace number? "see @ref{spacing-spanner-interface}.")
(grob-property-description 'arithmetic-multiplier number? "see @ref{spacing-spanner-interface}.")
+(grob-property-description 'arpeggio-direction dir? "If set, put an
+arrow on the arpeggio squiggly line.")
(grob-property-description 'attachment pair? "cons of symbols, '(LEFT-TYPE . RIGHT-TYPE), where both types may be alongside-stem, stem, head or loose-end.")
(grob-property-description 'stem-attachment-function procedure? "Where
(lily-interface
'arpeggio-interface
"Functions and settings for drawing an arpeggio symbol (a wavy line left to noteheads."
- '(stems))
+ '(stems arpeggio-direction))
(number->string (ly-get-mus-property mus 'denominator))
))
+(define (unfold-repeats music)
+"
+[Rune Zedeler]
+
+Han-Wen Nienhuys wrote:
+
+> It shouldn't be hard to write a Scheme function to replace all repeats
+> with unfold repeats.
+[...]
+> Left to the reader as an exercise.
+
+With thanks to Han-Wen:
+
+
+"
+ (let* ((es (ly-get-mus-property music 'elements))
+ (e (ly-get-mus-property music 'element))
+ (body (ly-get-mus-property music 'body))
+ (alts (ly-get-mus-property music 'alternatives))
+ (n (ly-music-name music)))
+
+ (if (equal? n "Repeated_music")
+ (begin
+ (ly-set-mus-property
+ music 'length Repeated_music::unfolded_music_length)
+ (ly-set-mus-property
+ music 'iterator-ctor Unfolded_repeat_iterator::constructor)))
+
+ (if (pair? es)
+ (ly-set-mus-property
+ music 'elements
+ (map unfold-repeats es)))
+
+ (if (music? alts)
+ (ly-set-mus-property
+ music 'alternatives
+ (unfold-repeats alts)))
+
+ (if (music? body)
+ (ly-set-mus-property
+ music 'body
+ (unfold-repeats body)))
+
+ (if (music? e)
+ (ly-set-mus-property
+ music 'element
+ (unfold-repeats e)))
+
+
+ music))
+
\botalign{\hbox{\raise #1\leftalign{\kern #2{}#3}}}}%
% Are we using PDFTeX? If so, use pdf definitions.
+% MiKTeX checks \pdfoutput the wrong way, makes our
+% check more complicated.
\ifx\pdfoutput\undefined
\input lily-ps-defs
\else
- \pdfoutput=1
- \input lily-pdf-defs
+ \ifx\pdfoutput\relax
+ \input lily-ps-defs
+ \else
+ \pdfoutput=1
+ \input lily-pdf-defs
+ \fi
\fi
\def\EndLilyPondOutput{%