]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-1.3.125
authorfred <fred>
Wed, 27 Mar 2002 00:48:22 +0000 (00:48 +0000)
committerfred <fred>
Wed, 27 Mar 2002 00:48:22 +0000 (00:48 +0000)
42 files changed:
Documentation/topdocs/README.texi
Documentation/user/GNUmakefile
Documentation/user/bugs.itexi
Documentation/user/convert-ly.itexi
Documentation/user/development.itexi
Documentation/user/lilypond.tely
Documentation/user/ly2dvi.itexi
Documentation/user/midi2ly.itexi
Documentation/user/programs.itexi
input/bugs/forte.ly [new file with mode: 0644]
input/test/bar-break.ly
input/test/generic-output-property.ly
input/test/glissando.ly
input/test/slur-proof.ly
input/test/stem-tremolo.ly
input/tutorial/orchestral.ly [new file with mode: 0644]
input/tutorial/sammartini.ly
input/tutorial/singing-saw.ly [new file with mode: 0644]
input/tutorial/wss.ly [new file with mode: 0644]
lily/auto-change-iterator.cc
lily/chord-tremolo-iterator.cc
lily/folded-repeat-iterator.cc
lily/include/auto-change-music.hh
lily/include/chord-tremolo-iterator.hh
lily/include/folded-repeat-iterator.hh
lily/include/lyric-combine-music-iterator.hh
lily/include/musical-request.hh
lily/include/part-combine-music-iterator.hh
lily/include/unfolded-repeat-iterator.hh
lily/lyric-combine-music-iterator.cc
lily/moment.cc
lily/music-iterator.cc
lily/note-head-line-engraver.cc
lily/parser.yy
lily/part-combine-music-iterator.cc
lily/scores.cc
lily/unfolded-repeat-iterator.cc
ly/performer.ly
ly/property.ly
scm/generate-documentation.scm
scm/translator-description.scm
scripts/lilypond-book.py

index f1b3d8ded86558fb7e18fb05e149c332406f337e..5c0af13b71a101030df496b32511e663acf99b99 100644 (file)
@@ -15,7 +15,7 @@ the GNU Project.
 
 LilyPond uses a versioning scheme similar to the Linux kernel.  In a
 version "x.y.z", an even second number 'y' denotes a stable version.
-For development versions 'y' is odd.  Sh, in theory, version 1.2 is stable,
+For development versions 'y' is odd.  So, in theory, version 1.2 is stable,
 which means that there are no glaring errors in it. In practice 1.2.x is also
 unmaintained.
 
@@ -116,11 +116,6 @@ questions use @email{help-gnu-music@@gnu.org} and
 @email{gnu-music-discuss@@gnu.org}.  Please consult the FAQ and
 installation instructions before mailing your problems.
 
-@section CDROM distributions
-
-If you have received LilyPond on a cdrom, chances are that development
-has moved some patchlevels up.  Please check the latest version of
-LilyPond before reporting bugs.
 
 
 @bye
index 2259ace7e6668bf71fbb2698d886b12041ce07fe..b73273417f731bb09595c26efc29e31a1ca65852 100644 (file)
@@ -80,7 +80,7 @@ deep-symlinks:
        cd $(outdir) && rm -f lilypond && ln -s . lilypond
        cd $(outdir) && rm -f lilypond-internals && ln -s . lilypond-internals
        cd $(outdir) && $(foreach i, $(LILYPOND_LINKS),\
-               rm -f $(i) && ln -s $(i) lilypond.html &&) true
+               rm -f $(i) && ln -s lilypond.html $(i) &&) true
 endif
 
 
index e9fb63e084ba8084e137c5b361ca92977542bdc8..4a4806fdaab14d40a7c87621d2c88cb05693ff17 100644 (file)
@@ -11,11 +11,13 @@ information:
 
 @itemize @bullet
 
-@item @strong{important:} a sample input which causes the error.
+@item a sample input which causes the error. This is @strong{important
+} to determine the cause of the problem.
 
 (and you will do us a favor if send a @strong{small} sample file)
 
-@item @strong{important:} which LilyPond version you use.
+@item which LilyPond version you use. This is  @strong{important information}
+
 
 This information tells us if you've found a new bug, or an old one.
 
index 1b8bf18726a5c70cc8433e4cc43599edfe96c6e7..55f0a7244051a32f750b7ad0ae69567b1fd8e223 100644 (file)
@@ -1,7 +1,7 @@
 @c -*-texinfo-*-
 
-@node Convert-ly
-@section Convert-ly
+@node convert-ly
+@section convert-ly
 
 
 Convert-ly sequentially applies different
index d21699b48b97e148346bfe05213c89f09495d585..39bfb5c978acba573f9c4227ae4289fe57baa348 100644 (file)
@@ -6,11 +6,13 @@
 
 @menu
 * Conversion stages::              Lilypond is a multi-pass program.
+* Moment:: 
 * Grobs::                          Graphical object  
 * Engraver::
 * Music_iterator::
 * Music::
 * Molecules::                       Molecules are stand-alone descriptions of output
+* Font metrics::                    Font metrics
 @end menu
 
 @node Conversion stages
@@ -66,6 +68,18 @@ are output, line by line.
 
 @end table
 
+@node Moment
+@section Moment
+
+Moment is a rational number. Since GUILE doesn't support them natively,
+so we created our own rational data type.
+
+@defun moment?
+@end defun
+
+@defun make-moment num den
+create the rational number @var{num}/@var{den}. 
+@end defun
 
 @node Grobs
 @section Grobs
@@ -95,6 +109,7 @@ how grobs work.
 * Setting grob properties::
 * Items and Spanners::
 * Pointer substitution::
+* Grob Scheme functions::
 @end menu
 
 @node What is a grob?
@@ -326,6 +341,26 @@ complications. When a  spanner crosses a line-break, then the spanner is
 the grob is made. A substitution process redirects all grob-reference
 so that spanner grob will only reference other grobs in the same line.
 
+@node Grob Scheme functions
+@unnumberedsubsec Grob Scheme functions
+
+
+@defun ly-get-grob-property g sym
+  Get the value of a value in grob @var{g} of property @var{sym}. It
+will return @code{'()} (end-of-list) if not true.
+@end  defun
+
+@defun ly-set-grob-property g sym val
+@end defun
+
+@defun ly-get-spanner-bound spanner dir
+@end defun
+
+@defun ly-grob? g
+@end defun
+
+
+
 @node Engraver
 @section Engraver
 
@@ -382,6 +417,40 @@ name of the property is @code{molecule-callback}, and its value should
 be a Scheme function taking one argument (the grob) and returning a
 Molecule.
 
+@defun molecule? m
+@end defun
+
+@defun ly-combine-molecule-at-edge  mol1 axis dir mol2 padding
+@end defun
+
+@defun molecule?  m 
+@end defun
+
+@defun ly-get-molecule-extent! mol axis
+@end defun
+
+@defun ly-set-molecule-extent! mol axis extent
+@end defun
+
+@node Font metrics
+@section Font metrics
+
+The font object represents the metric information of a font. Every font
+that is loaded into LilyPond can be accessed via Scheme. 
+
+[tfm vs. afm]
+
+
+@defun ly-get-default-font gr
+This returns the default font for grob @var{gr}.
+@end defun
+
+@defun ly-find-glyph-by-name font name
+This function retrieves a Molecule for the glyph named @var{name} in
+@var{font}.  The font must be available as a afm file.
+@cindex afm file
+
+@end defun
 
 
 @node Development
@@ -940,6 +1009,11 @@ TODO file, listed on the homepage of Jan and
 @uref{http://www.cs.uu.nl/~hanwen/lily-devel,Han-Wen}.  Modifying
 LilyPond almost always requires patches to the C++ part.
 
+If you still don't have any idea what to do, you might want to browse
+the mailing lists; Users do lots of feature requests, and you could
+implement any of them.
+
+
 There are also numerous other interesting projects that are more or less
 related  to LilyPond
 
index c6c63bd78bcb5e46fa17540aff8313b8e384cade..946b153ce106b8c26eab6bafab13af75763a1ed7 100644 (file)
@@ -110,11 +110,12 @@ this and other documentation.
 * Bug reports::                   Where to report bugs.
 * Reference Manual::               Reference Manual.
 * Features::                       Features, tips and tricks.
-* Internals:(lilypond-internals).  Auto generated detailed documentation.
-* Programs::                       External programs.
+* Utility programs::                       External programs.
 * Internals::                      How it all works.
 * Development::                    On developing code for LilyPond.
-* Index::                          Unified index.
+* Index of internals:(lilypond-internals).  Auto generated detailed documentation.
+* Index::                  Unified index.
+* Function Index::         Function index.
 @end menu
 
 @contents
@@ -142,4 +143,11 @@ this and other documentation.
 
 @printindex cp
 
+@node Function Index
+@unnumbered Function Index
+
+@printindex fn
+
+
+
 @bye
index 345d04870d5a868440d2bcb55ac67539ee76f017..5ce8cc88c065cf76f0429c4f2baeb032f8e25f98 100644 (file)
@@ -1,7 +1,7 @@
 @c -*-texinfo-*-
 
-@node Ly2dvi
-@section Ly2dvi
+@node ly2dvi
+@section ly2dvi
 
 Ly2dvi is a Python script which creates input file for La@TeX{},
 based on information from the output files from LilyPond.
index 3ba298539a77e184c820e3a25dd032584651e349..7a2841012d49215afe0fa68bdb21111e1d413b32 100644 (file)
@@ -1,7 +1,7 @@
 @c -*-texinfo-*-
 
-@node Midi2ly
-@section Midi2ly
+@node midi2ly
+@section midi2ly
 
 Midi2ly translates a MIDI input file to a LilyPond source file.
 Midi2ly is part of the GNU LilyPond music typesetting package.
index 6bd147ab36472148d024977b3a79ee86e79d17c1..e475978aa4fa9a6f37b4f73a49dc8a9e5f894563 100644 (file)
@@ -1,12 +1,12 @@
 @c -*-texinfo-*-
 
-@node Programs
-@chapter Programs
+@node Utility programs
+@chapter Utility programs
 
 @menu
-* Ly2dvi::                         Generating nice output with titles.
-* Convert-ly::                     Upgrading input files.
-* Midi2ly::                        Converting from MIDI input.
+* ly2dvi::                         Generating nice output with titles.
+* convert-ly::                     Upgrading input files.
+* midi2ly::                        Converting from MIDI input.
 @end menu
 
 @mbinclude ly2dvi.itexi
diff --git a/input/bugs/forte.ly b/input/bugs/forte.ly
new file mode 100644 (file)
index 0000000..bed65d1
--- /dev/null
@@ -0,0 +1,10 @@
+
+% y-pos of f is wrong
+
+\score { 
+   \notes \relative c' \context Voice = viola {
+       <c4-\f g' c>
+       \stemDown g'8. b,16
+       s1 s2. r4
+       g }
+}
index 37a6ee138db131b168b2009a3ae60761f38d8115..8b137891791fe96927ad78e64b0aad7bded08bdc 100644 (file)
@@ -1,28 +1 @@
-\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 in het midden"
-      }
-  }
-}
index f0368e7daa6b13e9b3b9fb12a691ea607194965c..f3a558658691e4c1dbad1bc53c75a63eaaa29fe7 100644 (file)
@@ -1,7 +1,7 @@
 \header{
 texidoc="
-As a last resort, the placement of items can be adjusted manually, by
-setting the @code{extra-offset} of an output object.
+As a last resort, the placement of grobs can be adjusted manually, by
+setting the @code{extra-offset} of a grob.
 ";
 }
 
@@ -22,9 +22,5 @@ setting the @code{extra-offset} of an output object.
 }
 \paper{
        linewidth=-1.0;
-       \translator {
-               \ScoreContext
-               \consists "Mark_engraver";
-       }
 }
 }
index 74d43fba581c138844dc38444a374976742765c7..115c5c2883eba0a5e78e8e9529f01efc402d8150 100644 (file)
@@ -1,15 +1,23 @@
 \header{
-texidoc="
-Simple glissando lines between notes are supported.  The first two glissandi are not consecutive.
+
+texidoc=" Simple glissando lines between notes are supported.
+The first two glissandi are not consecutive.
+
+The engraver does no time-keeping, so it involves some trickery to get
+< @{ s8 s8 s4 @} @{ c4 \\gliss d4 @} > working correctly.
+
 ";
 }
 
 \score{
         \context Staff=one \notes\relative c''{
-            % gliss non gliss and 
-            c \glissando d e \glissando f\break
+                    % gliss non gliss and 
+            c4 \glissando d e \glissando f \glissando \break
             % consecutive 
-            c \glissando d \glissando e f
+            c \glissando d \glissando e
+             < { \stemUp e8 \glissando g8 }
+               \context Voice = VB {\stemDown \repeat unfold 4 d16 } >
+            
     }
     \paper{
         linewidth = 70.\mm;
@@ -19,4 +27,4 @@ Simple glissando lines between notes are supported.  The first two glissandi are
               % \remove Clef_engraver;
        }
     }
-}
\ No newline at end of file
+}
index 8853a63a387f834a8611a5217b648a57eb580a94..6673652e45833cf9a66c111bf08e34780b0146ba 100644 (file)
@@ -1,7 +1,6 @@
 
-% :-(
 x = {
-\outputproperty #(make-type-checker 'Note_head) #'extra-offset = #'(-1 . 0)
+\outputproperty #(make-type-checker 'note-head-interface) #'extra-offset = #'(-1 . 0)
 }
 
 \score{
@@ -39,8 +38,8 @@ indent=0.0\mm;
 linewidth=-1.0\mm;
 \translator{
 \VoiceContext
-slurVerticalDirection = #1
-stemVerticalDirection = #-1
+Slur \override #'direction = #1
+Stem \override #'direction = #-1
 }
 }
 }
index 907608ac5e5ad0a2b777e270d78a4913d0b33398..3493dabef1c14409aeed2f06000872b5741fa583 100644 (file)
@@ -10,10 +10,8 @@ tremolo must be centered on the note.
 \version "1.3.117";
 \score{
        \context Voice\notes \relative c''{
-               %%?
-               \property Voice.textVerticalDirection = #1
-               %% burp, is this in staff or half spaces, or what?
-               \property Voice.textScriptPadding = #15
+               \property Voice.Text \set #'direction = #1
+               \property Voice.TextScript \set #'padding = #5
                a1:4^":4" a:8^":8" c:16^":16" a:32^":32" a^"x" a:^":"
                a4:4 c:8 a:16 c:32 a a: a2:
                \break
diff --git a/input/tutorial/orchestral.ly b/input/tutorial/orchestral.ly
new file mode 100644 (file)
index 0000000..25a3e41
--- /dev/null
@@ -0,0 +1,4 @@
+
+
+
+       
index b1269e15a4606e89db420a6cc7e617f54d349588..e0989b66ba7d60126025d23053765120efe2d0dd 100644 (file)
@@ -1,8 +1,12 @@
 \include "paper16.ly";
 
+stemdown = \property Voice.Stem \override #'direction = #-1
+stemup = \property Voice.Stem \override #'direction = #1
+stemboth = \property Voice.Stem \revert #'direction  
+
 viola = \notes \relative c' \context Voice = viola {
        <c4-\f g' c>
-       \property Voice.verticalDirection = \down g'8. b,16
+       \stemdown g'8. b,16
        s1 s2. r4
        g
 }
@@ -15,7 +19,7 @@ oboes = \notes \relative c'' \context Voice = oboe {
          \context Voice = oboeTwo {
                \stemdown
                \grace {
-                 \property Grace.verticalDirection = \down
+                 \property Grace.Stem \override #'direction = #-1
                  [f,16 g] }
                f8 e e2
        } >
@@ -25,15 +29,12 @@ oboes = \notes \relative c'' \context Voice = oboe {
        [<c16( e>  < )e8. g>] <c8 e,>
 }
 
-hoomPah  = \notes \transpose c' {
-    c8 \translator Staff = top \stemdown 
-    c'8 \translator Staff = bottom \stemup }
-
-hoomPahHoomPah = { [\hoomPah \hoomPah] }
+hoomPah  = \notes \repeat unfold 8 \transpose c' { c8 \stemdown c'8 \stemup }
 
 bassvoices = \notes \relative c' {
        c4 g8. b,16
-       \hoomPahHoomPah \hoomPahHoomPah \hoomPahHoomPah \hoomPahHoomPah
+       \autochange Staff \hoomPah o
+       \translator Staff = down
        \stemdown [c8 c'8] r4
        <g d'> r4
        < {\stemup r2 <e4 c'> <c8 g'> }
@@ -42,11 +43,11 @@ bassvoices = \notes \relative c' {
 
 \score {
        \context PianoStaff \notes <
-               \context Staff = top < \time 2/2;
-                       \context Voice = viola \viola
+               \context Staff = up < \time 2/2;
+                       \viola
                        \oboes
                >
-               \context Staff = bottom < \time 2/2; \clef bass;
+               \context Staff = down < \time 2/2; \clef bass;
                        \bassvoices
                >
        >
@@ -55,6 +56,3 @@ bassvoices = \notes \relative c' {
          indent = 0.0;
          linewidth = 15.0 \cm; }
 }
-
-       
-        
diff --git a/input/tutorial/singing-saw.ly b/input/tutorial/singing-saw.ly
new file mode 100644 (file)
index 0000000..b6080d8
--- /dev/null
@@ -0,0 +1,33 @@
+
+accompMotif = \notes \relative c {
+       \times 2/3 { c8 g' es' }
+       \times 2/3 { c' es, g, }
+}
+
+accomp =  \notes \relative c' \autochange Staff {
+       \autoBeamOff
+       <c2-\arpeggio es g>
+       r8 d-.
+       \showStaffSwitch
+       f,  b,
+       \hideStaffSwitch
+       \autoBeamOn
+       \repeat unfold 2 \accompMotif
+}
+piano = \context PianoStaff  \notes <
+  \context Staff = up <
+     s1*2
+     \accomp
+   >
+  \context Staff = down { \clef bass; s1*2 }
+>
+
+saw = \context Staff \notes  {
+       \property Staff.clefOctavation = #7
+       r1 b'''2 - \glissando ais'''2 
+}
+
+\score {
+  <   \saw \piano  >
+}
+       
diff --git a/input/tutorial/wss.ly b/input/tutorial/wss.ly
new file mode 100644 (file)
index 0000000..a74b650
--- /dev/null
@@ -0,0 +1,8 @@
+
+\score {
+
+\notes {\notes \reletive c' { 
+  \times 2/3 { [fis8 fis8 fis8]  }
+  \times 2/3 { [b b b]  }
+  bes4   
+}
index 5db9f69033f74919490a35e05e79f4aa5ef8096a..ab240be254dba4343feb527210a12de7497137d3 100644 (file)
@@ -7,7 +7,7 @@
   
  */
 
-#include "auto-change-music.hh"
+#include "music.hh"
 #include "auto-change-iterator.hh"
 #include "translator-group.hh"
 #include "musical-request.hh"
@@ -123,9 +123,7 @@ Auto_change_iterator::process (Moment m)
        {
          where_dir_ = s;
          String to_id =  (s >= 0) ?  "up" : "down";
-         Auto_change_music const * auto_mus = dynamic_cast<Auto_change_music const* > (music_l_);
-
-         String wh = ly_scm2string (auto_mus->get_mus_property ("what"));
+         String wh = ly_scm2string (music_l_->get_mus_property ("what"));
          change_to (child_iter_p_, wh, to_id);   
        }
     }
index 5ddad9598321aebc7a199ec0747910797ec4e99f..164efb439d71d86e80fc1bb51a036c94641544c9 100644 (file)
@@ -30,6 +30,12 @@ Chord_tremolo_iterator::Chord_tremolo_iterator()
   child_iter_p_ = 0;
 }
 
+Chord_tremolo_iterator::Chord_tremolo_iterator (Chord_tremolo_iterator const &src)
+  : Music_iterator (src)
+{
+  child_iter_p_ = src.child_iter_p_? src.child_iter_p_->clone () : 0; 
+}
+
 void
 Chord_tremolo_iterator::process (Moment m)
 {
index 71328c87d245098c16c2bab5c560e9a1563e8ec2..a6126ddcb4c28fd98d3533e7f8590c89726735cc 100644 (file)
@@ -37,6 +37,14 @@ Folded_repeat_iterator::~Folded_repeat_iterator ()
   delete alternative_iter_p_;
 }
 
+Folded_repeat_iterator::Folded_repeat_iterator (Folded_repeat_iterator const &src)
+  : Music_iterator (src)
+{
+  main_iter_p_ = src.main_iter_p_ ? src.main_iter_p_->clone () : 0;
+  alternative_iter_p_ = src.alternative_iter_p_ ? src.alternative_iter_p_->clone () : 0;
+  main_length_mom_ = src.main_length_mom_;
+}
+
 Moment
 Folded_repeat_iterator::pending_moment () const
 {
@@ -55,7 +63,7 @@ Folded_repeat_iterator::construct_children ()
   main_iter_p_ = get_iterator_p (mus->body ());
   if (!main_iter_p_->ok())
     {
-      leave_body ();
+     leave_body ();
       enter_alternative ();
     }
 }
index 0451dd1fbaf9495c27514832bfe321c11234968e..09c7cfafd0cb2ee13152e399db7d99198272b2fd 100644 (file)
@@ -1,25 +1 @@
-/*   
-  auto-change-music.hh -- declare Auto_change_music
-  
-  source file of the GNU LilyPond music typesetter
-  
-  (c) 1999--2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
-  
- */
-
-#ifndef AUTO_CHANGE_MUSIC_HH
-#define AUTO_CHANGE_MUSIC_HH
-
-#include "music-wrapper.hh"
-
-
-class Auto_change_music : public Music_wrapper
-{
-public:
-  Auto_change_music (SCM);
-
-};
-
-
-#endif /* AUTO_CHANGE_MUSIC_HH */
-
+#error
index 3ac4d45cfd44e1c6a87e61bb822d0e751dbe0aa5..7f5e5c4852dfe56382ccd13ef783bbfd02ed8fad 100644 (file)
@@ -18,7 +18,7 @@ public:
   VIRTUAL_COPY_CONS (Music_iterator);
   static SCM constructor_cxx_function;
   Chord_tremolo_iterator ();
-
+  Chord_tremolo_iterator (Chord_tremolo_iterator const & );
 protected:
   virtual ~Chord_tremolo_iterator ();
   virtual Moment pending_moment () const;
index 2dba3733c75b46e9547a865465064d85d7eed3ef..178414c7b68dbb24f462c5651b327588bb57ef8c 100644 (file)
@@ -21,7 +21,8 @@ class Folded_repeat_iterator : public Music_iterator
 public:
   VIRTUAL_COPY_CONS (Music_iterator);
   static SCM constructor_cxx_function;
-  
+
+  Folded_repeat_iterator (Folded_repeat_iterator const &src);
   Folded_repeat_iterator ();
   ~Folded_repeat_iterator ();
   
@@ -39,7 +40,7 @@ protected:
 private:
   Music_iterator * main_iter_p_;
   Music_iterator * alternative_iter_p_;
-  int count_;
+
   Moment main_length_mom_;
 };
 #endif /* FOLDED_REPEAT_ITERATOR_HH */
index 0f200cad8935f3bae81d9af341ad4f4bb80f8fd7..dea39fcd91fc01a95894f741c3a09e01bdbd9313 100644 (file)
@@ -18,6 +18,7 @@ class Lyric_combine_music_iterator : public Music_iterator
 public:
   VIRTUAL_COPY_CONS (Music_iterator);
   Lyric_combine_music_iterator ();
+  Lyric_combine_music_iterator (Lyric_combine_music_iterator const&src);
   static SCM constructor_cxx_function;
 protected:
   virtual void construct_children ();
index 45cf8e38250115e2f7ef003301bf0f21dc9f7d53..24052a3c9650da9dfffc0454766ea2a479a20ddf 100644 (file)
@@ -160,6 +160,7 @@ public:
 
 class Glissando_req : public Request
 {
+public:
   VIRTUAL_COPY_CONS (Music);
 };
 
index 61db1ad3ca04561c98e5c9c1be7cb0ca38c0ff07..4e62ff651cfdb35227efdbf84e4d429a8f533e7d 100644 (file)
@@ -22,7 +22,7 @@ public:
   static SCM constructor_cxx_function; 
 protected:
   virtual ~Part_combine_music_iterator ();
-
+  Part_combine_music_iterator (Part_combine_music_iterator const &);
   virtual void construct_children ();
   virtual Moment pending_moment () const;
   virtual void process (Moment);
index a3c757a38177bbe3ceb86fac69b3636b7ca5b6ac..11b6a8fef3035ed851419180b7be58590f0179f5 100644 (file)
@@ -50,7 +50,7 @@ public:
   SCM alternative_cons_;
   ~Unfolded_repeat_iterator();
   Unfolded_repeat_iterator ();
-
+  Unfolded_repeat_iterator (Unfolded_repeat_iterator const &);
 protected:  
   virtual void construct_children ();
   virtual Moment pending_moment () const;
index 72453e56594672c6fb2eef4496760a45d902c7fe..bcff3af02ae7d03a2b1b0aaf15172406823cc202 100644 (file)
@@ -98,6 +98,13 @@ Lyric_combine_music_iterator::~Lyric_combine_music_iterator ()
   delete music_iter_p_;
 }
 
+Lyric_combine_music_iterator::Lyric_combine_music_iterator (Lyric_combine_music_iterator const & src)
+    : Music_iterator (src)
+{
+
+  lyric_iter_p_ = src.lyric_iter_p_ ? src.lyric_iter_p_->clone () : 0;
+  music_iter_p_ = src.music_iter_p_ ? src.music_iter_p_->clone () : 0;  
+}
 Music_iterator*
 Lyric_combine_music_iterator::try_music_in_children (Music *m) const
 {
index 7b92cdbdcc4a0959bf67ee06dad57053c266b68d..9b3080f12d1138cf6046b248207e50795aad4243 100644 (file)
@@ -67,7 +67,6 @@ void
 init_moments ()
 {
   scm_make_gsubr ("make-moment", 2 , 0, 0, (Scheme_function_unknown) make_rational);
-  scm_make_gsubr ("make-moment", 2 , 0, 0, (Scheme_function_unknown) make_rational);  
 }
 
 ADD_SCM_INIT_FUNC(moms,init_moments);
index eb05061be111725ae884dd667f37b82ae6a74639..b0998be9b894f83998caca31486d6e1657517521 100644 (file)
 
 Music_iterator::Music_iterator ()
 {
-  //  clone_i_ = 0;
 }
 
 Music_iterator::Music_iterator (Music_iterator const& src)
 {
-  //  clone_i_ = src.clone_i_ + 1;
   handle_ = *src.handle_.clone ();
   music_l_ = src.music_l_;
   music_length_ = src.music_length_;
index b2717201cffde2295796bcedfb00280e2f086ae2..2a6336f89dafb4601d22a9b2a29535fc85db93af 100644 (file)
 /**
    Create line-spanner grobs for glissandi (and possibly other) lines
    that connect note heads.
- */
 
+
+   TODO: have the line commit suicide if the notes are connected with
+   either slur or beam.
+
+*/
 class Note_head_line_engraver : public Engraver
 {
 public:
@@ -74,29 +78,23 @@ Note_head_line_engraver::acknowledge_grob (Grob_info info)
 {
   if (Rhythmic_head::has_interface (info.elem_l_))
     {
-      last_head_ = head_;
       head_ = info.elem_l_;
       if (to_boolean (get_property ("followThread")))
        {
-         Translator* staff = daddy_trans_l_ && daddy_trans_l_->daddy_trans_l_
-           ? daddy_trans_l_->daddy_trans_l_->daddy_trans_l_ : 0;
-         if (staff != last_staff_)
+         Translator_group  * tr = daddy_trans_l_;
+         while (tr && tr->type_str_ != "Staff")
+           tr = tr->daddy_trans_l_ ;
+
+         if (tr && tr->type_str_ == "Staff" && tr != last_staff_)
            {
              if (last_head_)
                follow_ = true;
-             last_staff_ = staff;
+             last_staff_ = tr;
            }
        }
     }
 }
 
-static Grob*
-beam_l (Grob *h)
-{
-  if (Grob *s = Rhythmic_head::stem_l (h))
-    return Stem::beam_l (s);
-  return 0;
-}
 
 void
 Note_head_line_engraver::create_grobs ()
@@ -104,36 +102,28 @@ Note_head_line_engraver::create_grobs ()
   if (!line_ && (follow_ || last_req_) && last_head_ && head_
       && (last_head_ != head_))
     {
-      /* Don't follow if there's a beam.
+      /* TODO: Don't follow if there's a beam.
 
-        Hmm, this doesn't work, as head_ does not yet have a beam.
+        We can't do beam-stuff here, since beam doesn't exist yet.
         Should probably store follow_ in line_, and suicide at some
         later point */
-      if (!(follow_
-           && beam_l (last_head_) && beam_l (last_head_) == beam_l (head_)))
-       {
-         if (follow_)
-           line_ = new Spanner (get_property ("FollowThread"));
-         else
-           line_ = new Spanner (get_property ("Glissando"));
+      if (follow_)
+       line_ = new Spanner (get_property ("FollowThread"));
+      else
+       line_ = new Spanner (get_property ("Glissando"));
          
-         line_->set_bound (LEFT, last_head_);
-         line_->set_bound (RIGHT, head_);
+      line_->set_bound (LEFT, last_head_);
+      line_->set_bound (RIGHT, head_);
          
          /* Note, mustn't set y-parent of breakable symbol to simple item:
             one of the two broken parts won't have an y-parent! */
          /* X parent is set by set_bound */
-         line_->set_parent (Staff_symbol_referencer::staff_symbol_l (last_head_),
-                            Y_AXIS);
+      line_->set_parent (Staff_symbol_referencer::staff_symbol_l (last_head_),
+                        Y_AXIS);
          
-         announce_grob (line_, last_req_);
-       }
+      announce_grob (line_, last_req_);
+      last_req_ = 0;   
 
-      last_head_ = 0;
-      if (!follow_ && !req_)
-       head_ = 0;
-      
-      last_req_ = 0;
       follow_ = false;
     }
 }
@@ -146,8 +136,15 @@ Note_head_line_engraver::stop_translation_timestep ()
       typeset_grob (line_);
       line_ = 0;
     }
-  last_req_ = req_;
-  req_ = 0;
+  if (head_)
+    last_head_ = head_;
+  head_ = 0;
+
+  if (req_)
+    {
+      last_req_ = req_;
+      req_ =0;
+    }
 }
 
 
index bbfaf2438a0e1bbb40796afc234d53a2a2a9cb89..cc62753a21efcc6c4a5a4c764490cf308d1d04f5 100644 (file)
@@ -39,9 +39,9 @@
 #include "repeated-music.hh"
 #include "lilypond-input-version.hh"
 #include "grace-music.hh"
-#include "auto-change-music.hh"
 #include "part-combine-music.hh"
 #include "scm-hash.hh"
+#include "auto-change-iterator.hh"
 
 #include "chord.hh"
 
@@ -772,8 +772,9 @@ Composite_music:
                $$ = csm;
        }
        | AUTOCHANGE STRING Music       {
-               Auto_change_music * chm = new Auto_change_music (SCM_EOL);
+               Music * chm = new Music_wrapper (SCM_EOL);
                chm->set_mus_property ("element", $3->self_scm ());
+               chm->set_mus_property ("iterator-ctor", Auto_change_iterator::constructor_cxx_function);
 
                scm_unprotect_object ($3->self_scm ());
                chm->set_mus_property ("what", $2); 
@@ -1267,6 +1268,9 @@ verbose_request:
                a->set_spot (THIS->here_input ());
                $$ = a;
        }
+       /*
+duh, junk this syntax from the parser, if possible. 
+       */
        | ARPEGGIO {
                Arpeggio_req *a = new Arpeggio_req;
                a->set_spot (THIS->here_input ());
index 235b64452ee9640e8d7f5297b0ab09f08f6d1c6c..526b70ab88815ea1e94bf42bbc0ec9d4fbecffeb 100644 (file)
@@ -28,6 +28,18 @@ Part_combine_music_iterator::~Part_combine_music_iterator ()
   delete first_iter_p_;
 }
 
+Part_combine_music_iterator::Part_combine_music_iterator (Part_combine_music_iterator const &src)
+  : Music_iterator (src)
+{
+  second_iter_p_ = src.second_iter_p_ ? src.second_iter_p_->clone () : 0;
+  first_iter_p_ = src.first_iter_p_ ? src.first_iter_p_->clone () : 0;
+
+  first_until_ = src.first_until_;
+  second_until_ = src.second_until_;
+  state_ = src.state_;
+  suffix_ = src.suffix_;
+}
+
 Moment
 Part_combine_music_iterator::pending_moment () const
 {
index 3310a88fc44a388d43fa652567d2391424f3ee9b..84e9891994011909fb0a160d85d2236b36b949c3 100644 (file)
@@ -96,7 +96,8 @@ clear_scores ()
   score_global_array.clear();
   
   inclusion_global_array.clear ();
-  scm_unprotect_object (global_header_p ->self_scm ());
+  if (global_header_p)
+    scm_unprotect_object (global_header_p ->self_scm ());
   global_header_p =0; 
 }
 
index c8a6fd404da49f97d617856467da020ff803761d..89e5ba2fc60575b85c858512807d55baef8f6922 100644 (file)
@@ -19,6 +19,17 @@ Unfolded_repeat_iterator::~Unfolded_repeat_iterator ()
   delete current_iter_p_;
 }
 
+Unfolded_repeat_iterator::Unfolded_repeat_iterator (Unfolded_repeat_iterator const &src)
+  : Music_iterator (src)
+{
+  done_count_ = src.done_count_;
+  current_iter_p_ = (src.current_iter_p_)? src.current_iter_p_->clone () : 0;
+  do_main_b_ = src.do_main_b_;
+  volta_b_ = src.volta_b_;
+  alternative_count_i_ = src.alternative_count_i_;
+  alternative_cons_ = src.alternative_cons_;
+}
+
 Unfolded_repeat_iterator::Unfolded_repeat_iterator ()
 {
   done_count_ =0;
@@ -26,6 +37,7 @@ Unfolded_repeat_iterator::Unfolded_repeat_iterator ()
   volta_b_ = false;
   do_main_b_ = false;
   alternative_count_i_ =0;
+  alternative_cons_ = SCM_EOL;
 }
 
 /**
index 4b300caf9fe7f6e07e94e9dd1dd58be64b15e2d0..c3ba784beaa22be9395adbcc81ceb0514244cc6a 100644 (file)
@@ -43,7 +43,9 @@ ThreadContext = \translator {
        \name Grace;
        \consists "Note_performer";
        \consists "Tie_performer";
-        weAreGraceContext = "1";
+        \consists "Swallow_performer";
+
+        weAreGraceContext = #t
 }
 
 \translator
index 95ba08ca181b102ee4303f6aa4512efb95530c5f..028933e231aa677b805ad6981cef9146ee1c6d1c 100644 (file)
@@ -82,11 +82,14 @@ endincipit = \notes{
 autoBeamOff = \property Voice.noAutoBeaming = ##t
 autoBeamOn = \property Voice.noAutoBeaming = ##f
 
-
 emptyText = \property Voice.textNonEmpty = ##f
 fatText = \property Voice.textNonEmpty = ##t
 
+showStaffSwitch = \property Thread.followThread = ##t
+hideStaffSwitch = \property Thread.followThread = ##f
+
+
 % To remove a Volta bracet or some other graphical object,
-% set it to turnOff. Example: \property Staff.VoltaBracket = turnOff
+% set it to turnOff. Example: \property Staff.VoltaBracket = \turnOff
 
 turnOff = #'((meta .  ((interfaces . ()))))
index 9e605e9424de07260ef24e03f5e1e09722317926..cbc19bae281a5836780999334a8d5e1e16f35dcb 100644 (file)
@@ -20,8 +20,6 @@
 (eval-string (ly-gulp-file "engraver-documentation-lib.scm"))
 (eval-string (ly-gulp-file "backend-documentation-lib.scm"))
 
-
-
 ;;(define no-copies #t)  ; from 490 to 410K, but doesn't look nice yet
 ;;
 ;; Also, copies of interfaces use up lots more space, but that's
        ("LilyPond context properties" . "context properties")       
        ("LilyPond backend" . "Detailed description of all Grobs")
        ("LilyPond interfaces" . "Grob Interfaces")
-       ("LilyPond backend properties" . "Grob properties")))
+       ("LilyPond backend properties" . "Grob properties")
+       ("Index" . "index")
+       ))
 
     
     
     doc
+
+    "@node Index
+@unnumbered Concept index
+
+@printindex cp
+
+@unnumbered Variable index
+
+@printindex vr
+
+@unnumbered Function index
+
+@printindex fn
+
+"
+
+    
     "\n@bye")
    out))
 
index 32c66834b7d59bfcfd926523f2cfdc35e8137227..559aa0bfa0e1618f097666f7c7a896ca24ea4c1a 100644 (file)
@@ -425,10 +425,10 @@ measurePosition and currentBarNumber to determine what number to print over the
     'Note_head_line_engraver
     (engraver-description
      "Note_head_line_engraver"
-     "Engrave a line between two note heads."
-     '(Glissando FollowThread)
-     '(
-      )))
+     "Engrave a line between two note heads, for example a glissando.
+If followThread is set, staff switches also generate a line."
+     '(Glissando)
+     '(followThread)))
 
    (cons
     'Note_name_engraver
index e6480c0e77163c7ab895dd999eadaa271a655b6a..ea8f9ce871a8d7240a75be47dd9ff4f50bcbb505 100644 (file)
@@ -326,8 +326,11 @@ output_dict= {
       %s
     }
   >
-\end{lilypond}""", 
-               'output-lilypond':r"""\begin[%s]{lilypond}
+\end{lilypond}""",
+               'output-filename' : r'''
+
+\verb+%s+:''',
+               'output-lilypond': r"""\begin[%s]{lilypond}
 %s
 \end{lilypond}""",
                'output-verbatim': "\\begin{verbatim}%s\\end{verbatim}",
@@ -342,6 +345,9 @@ output_dict= {
 %s
 @end lilypond 
 """,
+               'output-filename' : r'''
+
+@file{%s}:''',   
                  'output-lilypond-fragment': """@lilypond[%s]
 \context Staff\context Voice{ %s }
 @end lilypond """,
@@ -630,9 +636,11 @@ def completize_preamble (chunks):
 read_files = []
 def find_file (name):
        """
-       Search the include path for NAME. If found, return the contents of teh file.
+       Search the include path for NAME. If found, return the (CONTENTS, PATH) of the file.
        """
+       
        f = None
+       nm = ''
        for a in include_path:
                try:
                        nm = os.path.join (a, name)
@@ -643,10 +651,10 @@ def find_file (name):
                        pass
        if f:
                sys.stderr.write ("Reading `%s'\n" % nm)
-               return f.read ()
+               return (f.read (), nm)
        else:
                error ("File not found `%s'\n" % name)
-               return ''
+               return ('', '')
 
 def do_ignore(match_object):
        return [('ignore', match_object.group('code'))]
@@ -677,12 +685,22 @@ def make_lilypond(m):
                        (options, m.group('code')))]
 
 def make_lilypond_file(m):
+       """
+
+       Find @lilypondfile{bla.ly} occurences and substitute bla.ly
+       into a @lilypond .. @end lilypond block.
+       
+       """
+       
        if m.group('options'):
                options = m.group('options')
        else:
                options = ''
+       (content, nm) = find_file(m.group('filename'))
+       options = "filename=%s," % nm + options
+
        return [('input', get_output('output-lilypond') %
-                       (options, find_file(m.group('filename'))))]
+                       (options, content))]
 
 def make_lilypond_block(m):
        if m.group('options'):
@@ -752,7 +770,7 @@ def determine_format (str):
 def read_doc_file (filename):
        """Read the input file, find verbatim chunks and do \input and \include
        """
-       str = find_file(filename)
+       (str, path) = find_file(filename)
        determine_format (str)
        
        chunks = [('input', str)]
@@ -820,6 +838,15 @@ def schedule_lilypond_block (chunk):
        if 'png' in needed_filetypes and f(pathbase, '.eps', '.png'):
                todo.append('png')
        newbody = ''
+
+       if 'printfilename' in opts:
+               for o in opts:
+                       m= re.match ("filename=(.*)", o)
+                       if m:
+                               newbody = newbody + get_output ("output-filename") % m.group(1)
+                               break
+               
+       
        if 'verbatim' in opts:
                newbody = output_verbatim (body)
 
@@ -1033,7 +1060,7 @@ def check_texidoc (chunks):
                        (type, body, opts, todo, basename) = c;
                        pathbase = os.path.join (g_outdir, basename)
                        if os.path.isfile (pathbase + '.texidoc'):
-                               body = '\n@include %s.texidoc' % basename + body
+                               body = '\n@include %s.texidoc\n' % basename + body
                                c = (type, body, opts, todo, basename)
                n.append (c)
        return n