]> git.donarmstrong.com Git - lilypond.git/commitdiff
lilypond-0.1.58
authorfred <fred>
Sun, 24 Mar 2002 20:10:33 +0000 (20:10 +0000)
committerfred <fred>
Sun, 24 Mar 2002 20:10:33 +0000 (20:10 +0000)
31 files changed:
VERSION
bin/conflily.sh
configure.in
flower/Makefile
flower/include/interval.hh
flower/include/real.hh
flower/offset.cc
input/clefs.ly [new file with mode: 0644]
input/sleur.ly
lily/VERSION
lily/beam.cc
lily/bow.cc
lily/clef-grav.cc
lily/clef-item.cc
lily/direction.cc
lily/include/bezier.hh
lily/include/bow.hh
lily/include/lookup.hh
lily/include/slur.hh
lily/include/tie.hh
lily/lookup.cc
lily/plet-spanner.cc
lily/slur.cc
lily/staff-side.cc
lily/tie.cc
make/Template.make
mf/feta-sleur.mf
test/Makefile [new file with mode: 0644]
test/bow.cc [new file with mode: 0644]
tex/fetdefs.tex
tex/lily-ps-defs.tex

diff --git a/VERSION b/VERSION
index e27a742c2cc96b988512a310a820b27b3e641559..6b52b51a7f1a5128ba236d70862b143c9431ed77 100644 (file)
--- a/VERSION
+++ b/VERSION
@@ -1,6 +1,6 @@
 MAJOR_VERSION=0
 MINOR_VERSION=1
-PATCH_LEVEL=57
+PATCH_LEVEL=58
 MY_PATCH_LEVEL=
 
 # use the above to send patches, always empty for released version:
index 2eab5a059eea65eccfad3c44bc7f178c2651ae0f..dff069ab340af13c7ee6fe47ac5c6ff59eca1c71 100644 (file)
@@ -29,9 +29,7 @@ if [ "x$LILYINCLUDE" = "x" ]; then
        echo "export MFINPUTS=$MFINPUTS:$lelie/current/mf"
 fi
 
-mkdir -p ../build
-(cd ../build; 
-ln -sf $lelie/build/lily/lilypond bin/lilypond
-ln -sf $lelie/build/mi2mu/mi2mu bin/mi2mu
-../current/configure --prefix=/usr --enable-debugging --enable-printing --enable-checking)
+ln -sf $lelie/current/lily/out/lilypond bin/lilypond
+ln -sf $lelie/current/mi2mu/out/mi2mu bin/mi2mu
+configure --prefix=/usr --enable-debugging --enable-printing --enable-checking
 
index 8a85e74b773456d6b0f68cd0172a0c7a195e11d5..13bf8fd95f400577ca38320837518054d8692c75 100644 (file)
@@ -266,4 +266,5 @@ AC_OUTPUT(config.make)
 
 rm -f Makefile
 cp make/Toplevel.make.in ./Makefile
-chmod 555 Makefile
+chmod 444 Makefile
+
index 914663ff377ac55b82d624b516989cc40f12eb25..c970266bd6440c2d1f9f3caf00e0a81cda864612 100644 (file)
@@ -17,22 +17,6 @@ depth = ..
 #
 NAME = flower
 MODULE_NAME = flower
-#
-# edit VERSION only
-include ./$(depth)/VERSION
-include ./$(depth)/flower/VERSION
-
-# generic variables:
-#
-include ./$(depth)/make/Variables.make
-include ./$(depth)/make/Files.make 
-
-#include $(flowerout)/Flower-flags.make
-
-
-#
-# descent order into subdirectories:
-#
 SUBDIRS = include 
 #
 
@@ -41,17 +25,14 @@ SUBDIRS = include
 SCRIPTS = 
 README_FILES = ONEWS NEWS README TODO
 EXTRA_DISTFILES= VERSION $(README_FILES) $(SCRIPTS)
-#Flower-flags.make.in
-# aclocal.m4 configure config.hh.in configure.in
-
-
 
+include ./$(depth)/VERSION
+include ./$(depth)/flower/VERSION
 
-# generic targets and rules:
-#
+include ./$(depth)/make/Variables.make
+include ./$(depth)/make/Files.make 
 include ./$(depth)/make/Targets.make
 include ./$(depth)/make/Rules.make
-#
 
 default: the-lib
 
index 7a868a31ab9b92b8eac30849c01eae4c092613ac..2d7488aeeffa8efcbe71b7fc0a92006888bc8f1f 100644 (file)
@@ -26,7 +26,14 @@ struct Interval_t {
   static T infinity() ;
   static String T_to_str (T arg);
     
-  T center() { return (left + right) / T(2);}
+  // ugh, egcs 1.02 ices on this
+//  T center() { return (left + right) / T(2);}
+  // and can't handle this either
+  // anyone want to make a bug report?
+  T center() {
+    T two (2);
+    return (left + right) / two;
+  }
   void translate (T t) {
     left += t;
     right += t;
index 5b5bc26f7a13460174a9eaf54e6142b69cf0a53d..3b030c4cba429b9dbf14b396cc9d27c880343614 100644 (file)
@@ -17,7 +17,6 @@
 typedef double Real;
 const Real infinity_f = HUGE_VAL;
 
-
 template<class T> inline T abs (T x)
 {
   return x > 0 ? x : -x;
index ba1fee0075bdc80fda3dad0ea32771d58bd5d0ac..232967e675d4ea913df6d5833f51f62e5b0057b0 100644 (file)
@@ -11,6 +11,7 @@
 #include "offset.hh"
 
 
+#ifndef STANDALONE
 String
 Offset::str () const
 {
@@ -18,14 +19,14 @@ Offset::str () const
   s = String("(") + coordinate_a_[X_AXIS] + ", " + coordinate_a_[Y_AXIS] + ")";
   return s;
 }
-
+#endif
 
 Offset
 complex_multiply (Offset z1, Offset z2)
 {
   Offset z;
   z[X_AXIS] = z1[X_AXIS] * z2[X_AXIS] - z1[Y_AXIS]*z2[Y_AXIS];
-  z[Y_AXIS] = z1[X_AXIS] * z2[Y_AXIS] - z1[Y_AXIS] * z2[X_AXIS];
+  z[Y_AXIS] = z1[X_AXIS] * z2[Y_AXIS] + z1[Y_AXIS] * z2[X_AXIS];
   return z;
 }
 
diff --git a/input/clefs.ly b/input/clefs.ly
new file mode 100644 (file)
index 0000000..7722d99
--- /dev/null
@@ -0,0 +1,17 @@
+\score {
+       \melodic{ \octave c'; 
+         \clef "violin"; c1^"{violin}" \bar "||";
+         \clef "french";c1^"{french}" \bar "||";
+         \clef "soprano";c1^"{soprano}" \bar "||";
+         \clef "mezzosoprano";c1^"{mezzosoprano}" \bar "||";
+         \clef "alto";c1^"{alto}" \bar "||";
+         \clef "tenor";c1^"{tenor}" \bar "||";
+         \clef "baritone";c1^"{baritone}" \bar "||";
+         \clef "varbaritone";c1^"{varbaritone}" \bar "||";
+         \clef "bass";c1^"{bass}" \bar "||";
+         \clef "subbass";c1^"{subbass}" \bar "|.";
+         }
+         \paper{
+         }
+}
+
index 4ef5e88d9107a501af2908cfec2a28c4c4e39b2b..4dc4e08f6d7b560401c72390a29c9da714b523ac 100644 (file)
@@ -21,80 +21,167 @@ dirs = \melodic {
 
 complex = \melodic{
        \octave c';
-       'c16( 'e( 'g( 'b( d( f( a( c')))))))c4 c4 |
+       'c16( 'e( 'g( 'b( d( f( a( c'())))))))c4 c4 |
        \octave c''';
-       'c16( a( f( d( 'b( 'g( 'e( 'c)))))))c4 c4 |
+       'c16( a( f( d( 'b( 'g( 'e( 'c())))))))c4 c4 |
 }
 
-beum = \melodic{
+over = \melodic{
        \octave c'; 
-       [c8 c] c4 c4 c4 |
-}
 
-extend = \melodic{
-       \octave c;
-       c8(( c c )c c c c )c |
-       \[4/5c8( c c' c )c\]1/1 c c c c |
-       \[4/5c8( c c c c'\]1/1 c c c )c |
-       \[4/5c8( c c c c''\]1/1 c c c )c' |
-       \[4/5c8( c c c c'\]1/1 c c c )'c |
-       \[4/5c8( c c' c c\]1/1 c c c )c |
-       \[4/5c8( c c c ''c\]1/1 c c c )c |
-       \[4/5c8( c ''c c c\]1/1 c c c )c |
+       e( g' g' )e
+       e( a' a' )e
+       e( b' b' )e
+       e( c'' c'' )e
+       \stemup
+       e( c' c' )e
+       e( d' d' )e
+       e( e' e' )e
+       e( c'' c'' )e
+       \stemboth
+       e( f' b' )e
+       e( b' f' )e
+       e( e'' g' )e
+       e( g' e'' )e
+       \stemup
+       e( d' b )e
+       e( b d' )e
+       e( f' c'' )e
+       e( c'' f )e
 }
 
-extendbug = \melodic{
+under = \melodic{
        \octave c'; 
-       c4( c' c' )c
-       \stemup c'4( \stemdown e e \stemboth )c'
-       [c'8( b g a] [c' d' e' c'] [c' d' e' )c']
-       c( c' c' )c
-       e( g' g' )e
+       \stemdown 
+       f'( \stemboth d d \stemdown )f'
+       f'( \stemboth c c \stemdown )f'
+       f'( \stemboth 'b 'b \stemdown )f'
+       f'( \stemboth 'a 'a \stemdown )f'
+       \stemdown
+       f'( a a )f'
+       f'( g g )f'
+       f'( f f )f'
+       f'( 'a 'a )f'
 
+       \stemdown 
+       f'( \stemboth d 'b \stemdown )f'
+       f'( \stemboth 'b d \stemdown )f'
+       f'( \stemboth 'd 'b \stemdown )f'
+       f'( \stemboth 'b 'd \stemdown )f'
+       \stemdown
+       f'( f a )f'
+       f'( a f )f'
+       f'( f 'e )f'
+       f'( 'e f )f'
+}
+
+eccentric = \melodic{
+       \octave c';
+       \stemup
+       \[4/7 f( a' f f f f )f \] |
+       \[4/7 f( f f f f a' )f \] |
+       \stemdown
+       \[4/7 e'( c e' e' e' e' )e' \] |
+       \[4/7 e'( e' e' e' e' c )e' \] |
 }
 
-blend = \melodic{
-       \octave c; 
-       \stemdown; 
-%%         \[4/5c8( c ''c c c\]1/1 c c c )c |
-       \[4/5c8( c ''f c c\]1/1 c c c )c |
-
-       \[4/5c8( c \stemup ''f \stemdown c c\]1/1 c c c )c |
-       \stemup; 
-       \octave c''; 
-       \[4/5c8( c f'' c c\]1/1 c c c )c |
-       \[4/5c8( c \stemdown f'' \stemup c c\]1/1 c c c )c |
-       \stemboth;
-       c4( 'c16 'e 'g 'b d f a )'c16 c4 |
-       c4( 'c16 'e 'g 'b d f f )'c16 c4 |
+tiltup = \melodic{
        \octave c'; 
-       \stemdown; 
-       c( c'' c'' )c
-       \stemboth;
-       e( g' g' )e
-       e( g' g' )e
-       e( g' g' )e
-       e( g' g' )e
+       e( c'' c'' )e'
+       \stemup
+       e( c'' c'' )e'
+       \stemboth
+       e( g' e'' )e'
+       \stemup
+       e( c'' f )e'
+       \stemdown 
+       f'( \stemboth 'a 'a \stemdown )f''
+       \stemdown
+       f'( 'a 'a )f''
+}
+
+tiltdown = \melodic{
+       \octave c'; 
+       e'( c'' c'' )e
+       \stemup
+       e'( c'' c'' )e
+       \stemboth
+       e'( g' e'' )e
+       \stemup
+       e'( c'' f )e
+       \stemdown 
+       f''( \stemboth 'a 'a \stemdown )f'
+       \stemdown
+       f''( 'a 'a )f'
+}
+
+broken = \melodic{
+      \octave c'';
+      c c c c()
+      c c c c(
+      c )c c c(
+      c c )c c(
+      )a' a' a' a'()
+      a' a' a' a'()
+      c( c c )c 
+      c( c c )'f 
+      'f( c c )c 
+      'f( c c )'f
+}
+
+blend =        \melodic{
+       \octave c';
+       e( c'' c'' )e
+       \stemup
+       e( c'' c'' )e
+       \stemdown
+       f'( \stemboth 'a 'a \stemdown )f'
+       f'( 'a 'a )f'
+
+       \stemboth
+       e( c'' c'' )e'
+       e'( c'' c'' )e
+       d( d d )d
+
+       \stemdown
+       e( c'' c'' )e'
+       e'( c'' c'' )e
+       d( d d )d
+}
+
+
+bug = \melodic{
+       \octave c';
+       a()g( f )e
+       b'()a'( g' )f'
+       g( f' e' )d'
+       f f( g )a
+       c' () b () c' c'
 }
 
 \score{
        \melodic{ 
-               \blend
+               % use blend for fast check
+               %\blend
+% {
                \shortlong
                \dirs
                \complex
-               \beum
-               \octave c'; 
-               \stemup; 
-               \extend
-               \octave c''; 
-               \stemdown; 
-               \extend
-               \stemboth;
-               \extendbug
+               \over
+               \under
+               \eccentric
+               \tiltup
+               \tiltdown
+               \bug
+% }
+               % use broken with small linewidth
+               %\broken
        }
        \paper{ 
-%              castingalgorithm = \Wordwrap;
+             indent = 0.0\pt;
+               %for broken!
+               %linewidth= 40.\mm;
+               %castingalgorithm = \Wordwrap;
        }
 }
 
index 0523ff52f52607e82bc1d3c6b71dd72db46ce154..bd760860982a6dfb3a97da63a735f3763c460cf5 100644 (file)
@@ -1,4 +1,4 @@
 MAJOR_VERSION = 0
 MINOR_VERSION = 1
-PATCH_LEVEL = 57
+PATCH_LEVEL = 58
 MY_PATCH_LEVEL =
index 6ad3fe78c0b2cc8548f79b3b604701f6e994c5af..c3991ea3cabdcc53041c0cd04b125eb4a6ce642e 100644 (file)
@@ -29,7 +29,7 @@
 #include "lookup.hh"
 #include "grouping.hh"
 #include "stem-info.hh"
-#include "main.hh"  // experimental features
+//#include "main.hh"  // experimental features
 
 
 IMPLEMENT_IS_TYPE_B1 (Beam, Spanner);
@@ -450,7 +450,8 @@ Beam::set_stemlens ()
          s->set_stemend (left_y_ + slope_f_ * x);
          Real y = s->stem_length_f ();
          // duh: 
-         int mult_i = stems_[i]->beams_left_i_ >? stems_[i]->beams_right_i_;
+//       int mult_i = stems_[i]->beams_left_i_ >? stems_[i]->beams_right_i_;
+         int mult_i = multiple_i_;
          if (mult_i > 1)
              // dim(y) = internote
              y -= (Real)(mult_i - 1) * interbeam_f / internote_f;
@@ -588,7 +589,5 @@ Beam::stem_beams (Stem *here, Stem *next, Stem *prev) const
     Does beam quanting think  of the asymetry of beams? 
     Refpoint is on bottom of symbol. (FIXTHAT) --hwn.
    */
-  if (experimental_features_global_b && dir_ < 0)
-    leftbeams.translate_axis (-beamheight_f, Y_AXIS);
   return leftbeams;
 }
index 9433f69a18d57bcc55f793e0c02e2b286c958680..8be81c4f61a867bed6f72256e8ae345b6131993a 100644 (file)
@@ -4,58 +4,84 @@
   source file of the GNU LilyPond music typesetter
 
   (c) 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+      Jan Nieuwenhuizen <jan@digicash.com>
 */
 
 #include "bow.hh"
 #include "paper-def.hh"
 #include "molecule.hh"
 #include "lookup.hh"
+#include "bezier.hh"
 
 IMPLEMENT_IS_TYPE_B1(Bow,Directional_spanner);
 
 Bow::Bow ()
 {
-  dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0;
+  dy_f_drul_[LEFT] = dy_f_drul_[RIGHT] = 0.0;
   dx_f_drul_[LEFT] = dx_f_drul_[RIGHT] = 0.0;
 }
 
+Molecule*
+Bow::brew_molecule_p () const
+{
+  Molecule* mol_p = new Molecule;
+  
+  Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
+  
+  Real dx_f = width ().length ();
+  dx_f += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+  
+  Atom a = paper ()->lookup_l ()->slur (get_controls ());
+
+  a.translate (Offset (dx_f + dx_f_drul_[LEFT], dy_f + dy_f_drul_[LEFT]));
+  mol_p->add (a);
+  return mol_p;
+}
 
 Offset
 Bow::center () const
 {
-  Real dy =  dy_f_drul_[RIGHT]-dy_f_drul_[LEFT];
+  Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
 
-  Real w = width ().length ();
+  Real dx = width ().length ();
 
-  return Offset (w/2,dy );
+  return Offset (dx / 2, dy);
 }
 
-Molecule*
-Bow::brew_molecule_p () const
+Interval
+Bow::do_width () const    
 {
-  Molecule*output = new Molecule;
-  Real w = width ().length ();
-  
-  Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
-  
-  Real nw_f = paper ()->note_width ();
-  
-  w+= (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
-  Real round_w = w;            // slur lookup rounds the slurwidth .
-  
-  Atom a = paper ()->lookup_l ()->slur (dy_f, round_w, height_f (), dir_);
-
-  Real error = w-round_w;
-  a.translate (Offset ( (dx_f_drul_[LEFT] + 0.5*nw_f)
-                      + error/2,
-                      dy_f_drul_[LEFT]));
-  output->add (a);
-  return output;
+  Interval i = Spanner::do_width ();
+  Real dx = i.length();
+  return Interval (0, dx);
 }
 
-Real
-Bow::height_f () const
+Array<Offset>
+Bow::get_controls () const
 {
-  return 0;
+  Bezier_bow b (paper ());
+  b.set (get_encompass_offset_arr (), dir_);
+  b.calc ();
+  Array<Offset> controls;
+  controls.set_size (8);
+  for (int i = 0; i < 4; i++)
+    controls[i] = b.control_[i];
+  for (int i = 0; i < 4; i++)
+    controls[i + 4] = b.return_[i];
+  return controls;
+}
+
+Array<Offset>
+Bow::get_encompass_offset_arr () const
+{
+  Real dx = width (). length ();
+  dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
+  Real dy = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
+
+  Array<Offset> notes;
+  notes.push (Offset (0,0));
+  notes.push (Offset (dx, dy));
+
+  return notes;
 }
 
index 5f9a9376e743c1ceb92e2f2a4e35219b8362ce00..5812e7fc5d0ceff10cf56ee7e745aaad8bfa980d 100644 (file)
@@ -29,7 +29,7 @@ bool
 Clef_engraver::set_type (String s)
 {
   clef_type_str_ = s;
-  if (clef_type_str_ == "violin")
+  if (clef_type_str_ == "violin" || clef_type_str_ == "G" || clef_type_str_ == "G2")
     c0_position_i_= -6;
   else if (clef_type_str_ == "french")
     c0_position_i_= -8;
@@ -45,12 +45,25 @@ Clef_engraver::set_type (String s)
     c0_position_i_ = 4;
   else if (clef_type_str_ == "varbaritone")
     c0_position_i_ = 4;
-  else if (clef_type_str_ == "bass")
+  else if (clef_type_str_ == "bass" || clef_type_str_ == "F")
     c0_position_i_= 6;
   else if (clef_type_str_ == "subbass")
     c0_position_i_ = 8;
   else
+    switch(clef_type_str_[0])
+    {
+    case 'F': case 'f':
+           c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 2;
+           break;
+    case  'G': case 'g':
+           c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 10;
+           break;
+    case 'C': case 'c':
+           c0_position_i_ = 2 * (clef_type_str_[1] - '0') - 6;
+           break;
+    default:
     return false;
+    }              
   
   return true;
 }
index b3b468047f9761507ab4b28ab4a00cbff159881c..0c5c56eb2241bf654451f09132ac829c88f97261 100644 (file)
@@ -34,6 +34,12 @@ Clef_item::Clef_item()
   read ("violin");
 }
 
+/*
+ * Convert input clef string to 
+ * a clef symbol and a line position.
+ * This would be better done in the lexer (more efficient)
+ * or as a table-lookup.
+ */
 void
 Clef_item::read (String t)
 {
@@ -42,42 +48,58 @@ Clef_item::read (String t)
     {
       y_position_i_ = -2;
     }
-  else if (t == "french") 
+  else if (t == "bass") 
+    {
+      y_position_i_ = 2;
+    }
+  else if (t == "G" || t == "G2" || t == "treble")
+    {
+      symbol_ = "violin";
+      y_position_i_ == -2;
+    }
+  else if (t == "french" || t == "G1") 
     {
       symbol_="violin";
       y_position_i_ = -4;
     }
-  else if (t == "soprano") 
+  else if (t == "soprano" || t == "C1"
     {
       symbol_="alto";
       y_position_i_ = -4;
     }
-  else if (t == "mezzosoprano")
+  else if (t == "mezzosoprano" || t == "C2")
     {
       symbol_ = "alto";
       y_position_i_ = -2;
     }
   else if (t == "alto") 
     {
+      symbol_ = "alto";
       y_position_i_ = 0;
     }
-  else if (t == "tenor") 
+  else if (t == "C3")
     {
-      symbol_="alto";
+      symbol_ = "alto";
+      y_position_i_ = 0;
+  }
+  else if (t == "tenor" || t == "C4") 
+  {
+      symbol_ = "alto";
       y_position_i_ = 2;
     }
-  else if (t == "baritone")
+  else if (t == "baritone" || t == "C5")
     {
       symbol_ = "alto";
       y_position_i_ = 4;
     }
-  else if (t == "varbaritone")
+  else if (t == "varbaritone" || t == "F3")
     {
       symbol_ = "bass";
       y_position_i_ = 0;
     }
-  else if (t == "bass") 
+  else if (t == "F" || t == "F4")
     {
+      symbol_ = "bass";
       y_position_i_ = 2;
     }
   else if (t == "subbass")
@@ -85,6 +107,21 @@ Clef_item::read (String t)
       symbol_ = "bass";
       y_position_i_ = 4;
     }
+  else if (isdigit(t[1]))
+         switch (t[0])
+         { // we've already dealt with plain F, G  or C clef 
+                 // position 0 is line 3.        
+         case 'G':
+         case 'g':
+                 symbol_ = "violin";
+                 y_position_i_ =   2 * (t[1] - '0') - 6;
+                 break;
+         case 'F':
+         case 'f':
+                 symbol_ = "bass";
+                 y_position_i_ = 2 * (t[1] - '0') - 6;
+                 break;
+         }
 }
 
 void
index a0e0e14a5010f92b056fa645398eb925c6247846..802418fce5ef7371d596ffc953d63e3e606499a8 100644 (file)
 
 String direction_str (Direction d, Axis a)
 {
-  if (!d)
-    return "center";
+  String s("center");
   if (a == Y_AXIS)
     {
-       return d == UP ? "up" : "down";
+       s =( d == UP ? "up" : "down");
     }
   else if (a == X_AXIS)
     {
-      return d == LEFT ? "left" : "right" ;
+      s = (d == LEFT ? "left" : "right" );
     }
+  return s;
 }
index f5c871ed059b006f741b3763878d6a69024a8574..d69fc9819636bf8eb7e5582932e0d8ad29e0053b 100644 (file)
 class Bezier
 {
 public:
-  Bezier (int steps_i);
+  Bezier ();
 
   /**
   Calculate bezier curve into Offset (x,y) array.
   */
-  void calc ();
+  void calc (int steps);
 
   void set (Array<Offset> points);
 
@@ -50,8 +50,9 @@ public:
    Calculate bezier curve for bow from bow parameters.
    */
   void blow_fit ();
-  Real calc_f (Real height);
   void calc ();
+  Real calc_f (Real height);
+  void calc_bezier ();
   void calc_controls ();
   void calc_default (Real h);
   void calc_return (Real begin_alpha, Real end_alpha);
index 88f96bc4297a20ff10b45a026c164e5af2d936b8..ffa9db31a4cdd2336436ec7cc8935f627ad6b181 100644 (file)
@@ -9,23 +9,30 @@
 
 #ifndef BOW_HH
 #define BOW_HH
+
 #include "directional-spanner.hh"
+#include "curve.hh"
 
 /**
   Base class for anything that looks like a slur.
   Anybody with a better name?
   */
-class Bow : public Directional_spanner {
-protected:
-  Drul_array<Real> dy_f_drul_;
-  Drul_array<Real> dx_f_drul_;
+class Bow : public Directional_spanner
+{
+public:
+  Bow ();
+  Offset center () const;  
+
+  DECLARE_MY_RUNTIME_TYPEINFO;
 
+protected:
   virtual Molecule* brew_molecule_p () const;
-  virtual Real height_f () const;
+  virtual Interval do_width () const;    
+  Array<Offset> get_controls () const;
+  virtual Array<Offset> get_encompass_offset_arr () const;
 
-public:
-  Bow();
-  DECLARE_MY_RUNTIME_TYPEINFO;
-  Offset center() const;  
+  Drul_array<Real> dy_f_drul_;
+  Drul_array<Real> dx_f_drul_;
 };
+
 #endif // BOW_HH
index 523a00b8657ecae2b0dd7c4df340b4d28db419c3..fa4463146e0d5331bd77f298c2a2b4142f22ad91 100644 (file)
@@ -52,18 +52,12 @@ struct Lookup {
   Atom bar (String, Real height) const;
     
   Atom dots () const;
-  Atom slur (Real &dy, Real &dx, Real ht, Direction dir) const;
-  Atom control_slur (Array<Offset> controls, Real dx, Real dy) const;
+  Atom slur (Array<Offset> controls) const;
   Atom plet (Real &dy, Real &dx, Direction dir) const;
-  Atom tex_slur (int dy, Real &dx, Direction dir) const;
-  Atom ps_slur (Real dy, Real dx, Real ht, Real dir) const;
-  Atom half_slur (int dy, Real &dx, Direction dir, int xpart) const;
-  Atom half_slur_middlepart (Real &dx, Direction dir) const;
-  Atom big_slur (int dy, Real &dx, Direction dir) const;
   Atom text (String style, String text, int align = 1) const;
   Atom script (String idx) const;
   Atom hairpin (Real & width, bool decresc, bool continued) const;
   Atom dynamic (String) const;
 };
 
-#endif
+#endif // LOOKUPSYMS_HH
index e3df46d0ae876590e50cb41231c7200c2062b002..07ceb99374a39e6edc21118669d7b63533da9505 100644 (file)
 #include "lily-proto.hh"
 #include "parray.hh"
 #include "bow.hh"
-#include "curve.hh"
 
 /**
   A #Bow# which tries to drape itself around the stems too.
  */
-class Slur : public Bow {
+class Slur : public Bow
+{
 public:
   Link_array<Note_column> encompass_arr_;
   void add (Note_column*);
 
+  Slur ();
+
+  SCORE_ELEM_CLONE(Slur);
+  DECLARE_MY_RUNTIME_TYPEINFO;
+
 protected:
-  virtual Molecule* brew_molecule_p () const;
-  Array<Offset> get_notes () const;
-  Array<Offset> get_controls () const;
+  virtual Array<Offset> get_encompass_offset_arr () const;
 
-  virtual void set_default_dir();
-  virtual void do_post_processing();
+  virtual void set_default_dir ();
+  virtual void do_post_processing ();
   virtual void do_add_processing ();
   virtual void do_pre_processing ();
   virtual void do_substitute_dependency (Score_elem*, Score_elem*);
-  virtual Real height_f () const;
-
-  SCORE_ELEM_CLONE(Slur);
-  DECLARE_MY_RUNTIME_TYPEINFO;
 };
 
 #endif // SLUR_HH
index 30673fc9eede1ea7fc21b7b96f40af37faeb0788..a1100653ae6d15d88cadd25f74a5496cc2050d1e 100644 (file)
 /**
   Connect two noteheads.
   */
-class Tie : public Bow {
-    virtual void do_add_processing();
-    virtual void do_post_processing();
-    virtual void set_default_dir();
-    virtual void do_substitute_dependency (Score_elem*,Score_elem*);
-    
+class Tie : public Bow
+{
 public:
-    bool same_pitch_b_;
-    Drul_array<Note_head *> head_l_drul_;
-
+    Tie ();
     void set_head (Direction, Note_head*head_l);
 
-    Tie();
     DECLARE_MY_RUNTIME_TYPEINFO;
     SCORE_ELEM_CLONE(Tie);
+
+    bool same_pitch_b_;
+    Drul_array<Note_head *> head_l_drul_;
+
+protected:
+    virtual void do_add_processing ();
+    virtual void do_post_processing ();
+    virtual void set_default_dir();
+    virtual void do_substitute_dependency (Score_elem*,Score_elem*);
+    Array<Offset> get_controls () const;
 };
 #endif // TIE_HH
index 1ee100caa92dd2ea6c9d2bbefed756c604f7e465..5b0054084d6c6d5a2965dccc77a701916b152ae3 100644 (file)
@@ -19,6 +19,7 @@
 #include "tex.hh"
 #include "scalar.hh"
 #include "paper-def.hh"
+#include "string-convert.hh"
 #include "main.hh"
 
 Lookup::Lookup()
@@ -145,6 +146,45 @@ Lookup::flag (int j, Direction d) const
   return (*symtables_p_)("flags")->lookup (c + String (j));
 }
 
+Atom
+Lookup::slur (Array<Offset> controls) const
+{
+  assert (postscript_global_b);
+  assert (controls.size () == 8);
+
+  String ps = "\\embeddedps{\n";
+  
+#if 1
+  for (int i = 1; i < 4; i++)
+    ps += String_convert::double_str (controls[i].x ()) + " "
+      + String_convert::double_str (controls[i].y ()) + " ";
+
+  Real dx = controls[3].x ();
+  Real dy = controls[3].y ();
+  for (int i = 5; i < 8; i++)
+    ps += String_convert::double_str (controls[i].x () - dx) + " "
+      + String_convert::double_str (controls[i].y () - dy) + " ";
+#else
+  // this would be nice
+  for (int i = 1; i < 4; i++)
+    ps += String_convert::double_str (controls[i].x ()) + " "
+      + String_convert::double_str (controls[i].y ()) + " ";
+
+  for (int i = 5; i < 8; i++)
+    ps += String_convert::double_str (controls[i].x ()) + " "
+      + String_convert::double_str (controls[i].y ()) + " ";
+#endif
+
+  ps += " draw_slur}";
+
+  Atom s;
+  s.tex_ = ps;
+  
+  s.dim_[X_AXIS] = Interval (0, dx);
+  s.dim_[Y_AXIS] = Interval (0 <? dy,  0 >? dy);
+  return s;
+}
+
 Atom
 Lookup::streepje (int type) const
 {
@@ -298,4 +338,3 @@ Lookup::vbracket (Real &y) const
   return bracket;
 }
 
-
index 6787088b0e2bf4d9c014508b8c92e7d91bea601e..bb9980c263cdbc6897a0cf423e428338ab1dd07a 100644 (file)
@@ -65,7 +65,7 @@ Plet_spanner::brew_molecule_p () const
   Real interline_f = paper ()->interline_f ();
   Real numy_f = (dir_ > 0 ? 0 : -interline_f) + dir_ * interline_f / 2;
   Atom num (tdef_p_->get_atom (paper (), CENTER));
-  num.translate (Offset (width ().length ()/ 2 + dx_f_drul_[LEFT], 
+  num.translate (Offset (width ().length () / 1.8 + dx_f_drul_[LEFT], 
     dy_f_drul_[LEFT] + dy_f / 2 + numy_f));
 
   if (visibility_i_ >= 1)
index fcc57eab1d7050b16affe003f82451fd585ff07a..3e8cbdfe26d5eb40667d4bd5a07fc1bb4297f792 100644 (file)
@@ -4,14 +4,16 @@
   source file of the GNU LilyPond music typesetter
 
   (c) 1996, 1997 Han-Wen Nienhuys <hanwen@stack.nl>
+    Jan Nieuwenhuizen <jan@digicash.com>
 */
 
 /*
-  TODO:
-  
-  think about crossing stems.
-  Begin and end should be treated as a Script.
+  [TODO]
+    * begin and end should be treated as a Script.
+    * damping
+    * slur from notehead to stemend: c''()b''
  */
+
 #include "slur.hh"
 #include "scalar.hh"
 #include "lookup.hh"
 #include "debug.hh"
 #include "boxes.hh"
 #include "bezier.hh"
-#include "main.hh"
 
-IMPLEMENT_IS_TYPE_B1(Slur,Spanner);
+//IMPLEMENT_IS_TYPE_B1(Slur,Spanner);
+IMPLEMENT_IS_TYPE_B1(Slur,Bow);
+
+Slur::Slur ()
+{
+}
 
 void
 Slur::add (Note_column*n)
@@ -118,97 +124,38 @@ Slur::do_post_processing ()
        {
          dx_f_drul_[d] = -d 
            *(spanned_drul_[d]->width ().length () -0.5*nw_f);
+         Direction u = d;
+         flip(&u);
+         if ((extrema[u] == spanned_drul_[u]) && extrema[u]->stem_l_)
+           {
+             dy_f_drul_[d] = extrema[u]->stem_l_->height ()[dir_];
+             dy_f_drul_[u] = extrema[u]->stem_l_->height ()[dir_];
+           }
        }
       else if (extrema[d]->stem_l_ && !extrema[d]->stem_l_->transparent_b_) 
         {
          dy_f_drul_[d] = (int)rint (extrema[d]->stem_l_->height ()[dir_]);
-         /* normal slur from notehead centre to notehead centre, minus gap */
-         // ugh: diff between old and new slurs
-         if (!experimental_features_global_b)
-           dx_f_drul_[d] += -d * gap_f;
-         else
-           dx_f_drul_[d] += 0.5 * nw_f - d * gap_f;
+         dx_f_drul_[d] += 0.5 * nw_f - d * gap_f;
+         if (dir_ == extrema[d]->stem_l_->dir_)
+           {
+             if (dir_ == d)
+               dx_f_drul_[d] += 0.5 * (dir_ * d) * d * nw_f;
+             else
+               dx_f_drul_[d] += 0.25 * (dir_ * d) * d * nw_f;
+           }
        }
       else 
         {
-         dy_f_drul_[d] = (int)rint (extrema[d]->head_positions_interval ()[dir_])* inter_f;
+         dy_f_drul_[d] = (int)rint (extrema[d]->head_positions_interval ()
+           [dir_])* inter_f;
        }
       dy_f_drul_[d] += dir_ * interline_f;
     }
   while (flip(&d) != LEFT);
 }
 
-Real
-Slur::height_f () const
-{
-  Bezier_bow bow (paper ());
-  Array<Offset> notes = get_notes ();
-  bow.set (notes, dir_);
-
-  Real height = 0;
-  Real dy1 = bow.calc_f (height);
-  if (!dy1)
-    return height;
-
-  height = dy1;
-  bow.set (notes, dir_);
-  Real dy2 = bow.calc_f (height);
-  if (!dy2)
-    return height;
-
-  if (abs (dy2 - dy1) < paper ()->rule_thickness ())
-    return height;
-  
-  /*
-    Assume 
-      dy = B (h) 
-    with 
-      B (h) = a * h + b;
-
-    Then we get for height = h{dy=0}
-   */
-  Real a = (dy2 - dy1) / dy1;
-  Real b = dy1;
-  height = -b / a;
-    
-  if (check_debug && !monitor->silent_b ("Slur")) 
-    { 
-      cout << "************" << endl;
-      cout << "dy1: " << dy1 << endl;
-      cout << "dy2: " << dy2 << endl;
-      cout << "a: " << a << endl;
-      cout << "b: " << b << endl;
-      cout << "h: " << height << endl;
-    }
-
-  return height;
-}
-
-Molecule*
-Slur::brew_molecule_p () const
-{
-  if (!experimental_features_global_b)
-    return Bow::brew_molecule_p ();
-
-  Molecule* mol_p = new Molecule;
-  
-  Real dy_f = dy_f_drul_[RIGHT] - dy_f_drul_[LEFT];
-  
-  Real dx_f = width ().length ();
-  dx_f += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
-  
-  Atom a = paper ()->lookup_l ()->control_slur (get_controls (), dx_f, dy_f);
-
-  Real interline_f = paper ()->interline_f ();
-  Real gap_f = interline_f / 2; // 5;
-  Real nw_f = paper ()->note_width ();
-  a.translate (Offset (dx_f + 0.5 * nw_f + gap_f, dy_f + dy_f_drul_[LEFT]));
-  mol_p->add (a);
-  return mol_p;
-}
-
 Array<Offset>
-Slur::get_notes () const
+Slur::get_encompass_offset_arr () const
 {
   Real interline = paper ()->interline_f ();
   Real notewidth = paper ()->note_width ();
@@ -216,86 +163,76 @@ Slur::get_notes () const
 
   Stem* left_stem = encompass_arr_[0]->stem_l_;
   Real left_x = left_stem->hpos_f ();
-  // ugh, do bow corrections (see brew_mol)
-  left_x += dx_f_drul_[LEFT] + 0.5 * notewidth;
+  left_x += dx_f_drul_[LEFT];
 
-  // ugh, do bow corrections (see brew_mol)
   Real left_y = dy_f_drul_[LEFT];
-  // ugh, where does this asymmetry come from?
-  if (dir_ == DOWN)
-    left_y -= dir_ * internote;
-
-  /*
-    urg, corrections for broken slurs: extra begin or end position 
-   */
-  int first = 0;
-  int n = encompass_arr_.size ();
-  if (encompass_arr_[0] != spanned_drul_[LEFT])
-    {
-      n += 1;
-      first = 1;
-      left_x = spanned_drul_[LEFT]->width ().length ();
-      left_y = 0;
-    }
-  if (encompass_arr_.top () != spanned_drul_[RIGHT])
-      n += 1;
-
-  Array<Offset> notes;
-  notes.set_size (n);
 
   Real dx = width ().length ();
   dx += (dx_f_drul_[RIGHT] - dx_f_drul_[LEFT]);
   dx = dx <? 1000;
   dx = dx >? 2 * interline;
-    
+
   Real dy = (dy_f_drul_[RIGHT] - dy_f_drul_[LEFT]);
   if (abs (dy) > 1000)
     dy = sign (dy) * 1000;
 
-  notes[0].x () = 0;
-  notes[0].y () = 0;
-  notes[n - 1].x () = dx;
-  notes[n - 1].y () = dy;
-  for (int i = 1; i < n - 1; i++)
+  int first = 1;
+  int last = encompass_arr_.size () - 1;
+  if (encompass_arr_[0] != spanned_drul_[LEFT])
     {
-      Stem* stem = encompass_arr_[i - first]->stem_l_;
+      first = 0;
+      left_x = spanned_drul_[LEFT]->width ().length ();
+      left_x -= 2 * notewidth;
+//      left_y = 0;
+      Stem* stem = encompass_arr_[last]->stem_l_;
+      left_y = stem->dir_ == dir_ ? stem->stem_end_f ()
+       : stem->stem_begin_f () + 0.5 * dir_;
+      dy = 0;
+    }
+  if (encompass_arr_.top () != spanned_drul_[RIGHT])
+    {
+      last += 1;
+      dy = 0;
+    }
+
+  Array<Offset> notes;
+  notes.push (Offset (0,0));
+  for (int i = first; i < last; i++)
+    {
+      Stem* stem = encompass_arr_[i]->stem_l_;
       /* 
        set x to middle of notehead or on exact x position of stem,
        according to slur direction
           */
-      Real x = stem->hpos_f () - left_x + notewidth / 2;
+      Real x = stem->hpos_f ();
+
       if (stem->dir_ != dir_)
-       x += notewidth / 2;
+       x += 0.5 * notewidth;
       else if (stem->dir_ == UP)
-       x += notewidth;
+       x += 1.0 * notewidth;
+
+      x -= left_x;
+
       Real y = stem->dir_ == dir_ ? stem->stem_end_f ()
-       : stem->stem_begin_f () + 2.5 * dir_;
+       : stem->stem_begin_f () + 0.5 * dir_;
 
       /*
        leave a gap: slur mustn't touch head/stem
        */
       y += 2.5 * dir_;
+
+      // ugh: huh?
+      if (dir_ == DOWN)
+       y += 1.5 * dir_;
+
       y *= internote;
       y -= left_y;
 
-      notes[i].x () = x;
-      notes[i].y () = y;
+      notes.push (Offset (x, y));
     }
-  return notes;
-}
 
-Array<Offset>
-Slur::get_controls () const
-{
-  Bezier_bow b (paper ());
-  b.set (get_notes (), dir_);
-  b.calc ();
-  Array<Offset> controls;
-  controls.set_size (8);
-  for (int i = 0; i < 4; i++)
-    controls[i] = b.control_[i];
-  for (int i = 0; i < 4; i++)
-    controls[i + 4] = b.return_[i];
-  return controls;
+  notes.push (Offset (dx, dy));
+
+  return notes;
 }
 
index 99476a6206a1a326108dc71585c017a4b691ab7e..404283066c1378ece2d9cd41b932bf05c7ad5222 100644 (file)
@@ -69,12 +69,17 @@ Staff_side::get_position_f () const
   Interval v = support_height();
 
   // ugh, dim[y] = PT over here
-  y = v[dir_] + 2 * dir_ * inter_f;
+  y = v[dir_] + 1 * dir_ * inter_f;
 
   int y_i = (int)rint (y / inter_f);
   // ugh: 5 -> staff_lines
-  if ((abs (y_i) < 5) && !(abs (y_i) % 2))
-    y += (Real)dir_ * inter_f;
+  if (abs (y_i) < 5)
+    {
+      if (!(abs (y_i) % 2))
+       y += (Real)dir_ * inter_f;
+    }
+//  else
+//    y = v[dir_] + 1 * dir_ * inter_f;
 
   return y;
 }
index de7b328b11c695583703b317ae3427b795120efe..799bebaaabb96e7f4197690f03112889c7d4f161 100644 (file)
@@ -12,6 +12,7 @@
 #include "p-col.hh"
 #include "debug.hh"
 
+IMPLEMENT_IS_TYPE_B1(Tie,Bow);
 
 void
 Tie::set_head (Direction d, Note_head * head_l)
@@ -93,7 +94,9 @@ Tie::do_post_processing()
       if (head_l_drul_[d] && head_l_drul_[d]->extremal_i_)
        {
          /* normal tie between noteheads, with gap of space */
-         dx_f_drul_[d] += -d * (0.5 * nw_f + gap_f);
+         if (d == LEFT)
+           dx_f_drul_[d] +=  nw_f;
+         dx_f_drul_[d] += -d * gap_f;
          /* attach to outer 3/4 end of head */
          dy_f_drul_[d] += dir_ * 0.25 * interline_f;
        }
@@ -121,4 +124,3 @@ Tie::do_substitute_dependency (Score_elem*o, Score_elem*n)
     head_l_drul_[RIGHT] = new_l;
 }
 
-IMPLEMENT_IS_TYPE_B1(Tie,Bow);
index 501aeab9df6b54b5ac2e797f2bab1db8dfe8500f..9da75f907132543ad2633843226580f7abeaf6a0 100644 (file)
@@ -51,17 +51,16 @@ LOADLIBES +=
 
 # main target of this module:
 #
-# MAINTARGET = $(EXECUTABLE)
-# MAINTARGET = $(LIBRARY)
-MAINTARGET = 
-
-default: $(MAINTARGET)
+default: $(EXECUTABLE)
+# default: $(LIBRARY)
+include ./$(depth)/make/Files.make 
+include ./$(depth)/make/Targets.make
+include ./$(depth)/make/Rules.make
 #
 
-# generic targets and rules:
-#
 include ./$(depth)/make/Targets.make
 include ./$(depth)/make/Rules.make
-#
 
+EXECUTABLES=
+# include $(depth)/make/Executable.make
 
index a1385857af9f8388f1d977a5a1cd640329b40dbe..24637e273dd1b632c11c88286dfe0b4ccf9ff167 100644 (file)
@@ -6,6 +6,7 @@
 % (c) 1997 Jan Nieuwenhuizen <jan@digicash.com>
 % & Han-Wen Nienhuys <hanwen@stack.nl>
 % 
+% see Documentation/fonts.tex
 
 % mode_setup;
 
@@ -19,34 +20,17 @@ def atan(expr x) =
        (angle(1,x)*pi/180)
        enddef;
 
-%breapth, width, depth, height
-
-% urgh
-% having mf would be nice if only from a "use the source" point of view.
-%
-% getslurcontrol:
-%        slurhtlimit 90 div /slur_alpha exch def
-%        slurratio 60 div slur_alpha div  /slur_beta  exch def
-%        slur_beta mul 1 atan slur_alpha mul
-%
-% draw_slur:
-%        slur_b getslurcontrol 
-%        slur_dir mul /slur_ht exch def
-%        slur_b getslurcontrol /slur_indent exch def       
-%
 
 sleur_pen#:=stafflinethickness#;
 slurheightlimit#:=staffsize#/2;
-% staffrulethickness 1.5 mul  /slur_thick exch def
-slurthick#:=3/2stafflinethickness#;
+slurthick#:=1.8stafflinethickness#;
 
 define_pixels(staffsize,interline,stafflinethickness);
 define_pixels(sleur_pen,slurheightlimit,slurthick);
 
-sluralpha:=slurheightlimit#*pi/2;
-% slurratio:=1/3;
-slurratio:=0.3333;
-slurbeta:=3/4*pi*slurratio/sluralpha;
+sluralpha:=2slurheightlimit#/pi;
+slurratio:=1/3;
+slurbeta:=pi*slurratio/2slurheightlimit#;
 
 def draw_slur(expr dxs,dys,hs,d) =
        save x, y;
@@ -56,8 +40,7 @@ def draw_slur(expr dxs,dys,hs,d) =
        h#:=hs*1pt#;
        define_pixels(dx,dy);
        b#:=length(dx#,dy#);
-       % ugh: huh? 2/5
-       indent#:=2/5*sluralpha*atan(slurbeta*b#);
+       indent#:=sluralpha*atan(slurbeta*b#);
        define_pixels(b,h,indent);
        height:=(indent+h)*d;
        z1=(0,0);
diff --git a/test/Makefile b/test/Makefile
new file mode 100644 (file)
index 0000000..4f89904
--- /dev/null
@@ -0,0 +1,50 @@
+# project  LilyPond -- the musical typesetter
+# title           makefile for test
+# file    test/Makefile 
+#
+# Copyright (c) 1997 by
+#      Jan Nieuwenhuizen <jan@digicash.com>
+#      Han-Wen Nienhuys <hanwen@stack.nl>
+#
+
+# subdir level:
+#
+depth = ..
+#
+
+# generic variables:
+#
+include ./$(depth)/make/Variables.make 
+#
+
+# identify module:
+#
+NAME = test
+MODULE_NAME = test
+
+# descent order into subdirectories:
+#
+SUBDIRS =
+#
+
+include ./$(depth)/make/Files.make
+
+# list of custom libraries:
+#
+CUSTOMLIBES = \
+
+LOADLIBES +=
+#
+
+# main target of this module:
+#
+default: $(EXECUTABLE)
+include ./$(depth)/make/Files.make 
+include ./$(depth)/make/Targets.make
+include ./$(depth)/make/Rules.make
+#
+
+EXECUTABLES=bow
+include $(depth)/make/Executable.make
+
+
diff --git a/test/bow.cc b/test/bow.cc
new file mode 100644 (file)
index 0000000..bb85ea3
--- /dev/null
@@ -0,0 +1,212 @@
+// vim:sw=2 makeprg=g++\ -g\ bow.cc\ -o\ bow
+#include <iostream.h>
+#define PT
+// #define STAFFHEIGHT 16.0
+#define STAFFHEIGHT 20.0
+
+#define UP 1
+#define DOWN (-1)
+
+// mmm
+#define STANDALONE
+
+#include <math.h>
+
+typedef void *Paper_def;
+
+#include "bezier.hh"
+#include "bezier.cc"
+#include "offset.cc"
+
+struct Point
+{
+  Real x, y;
+};
+
+void
+out (Bezier_bow& b)
+{
+  cout << "save dx,dy,x,y;\n";
+  for (int i = 0; i < 4; i++)
+      cout << "z" << i + 1 << " = (" << b.control_[i].x ()
+       << ", " << b.control_[i].y () << ");\n";
+  for (int i = 1; i < 3; i++)
+      cout << "z" << i + 4 << " = (" << b.return_[i].x ()
+       << ", " << b.return_[i].y () << ");\n";
+#if 0
+  cout << "pickup pencircle scaled 0.5pt#;\n";
+  cout << "draw z2--z3; draw (50,0)-- 0.5[z2,z3];\n";
+#endif
+  cout << "pickup pencircle scaled 4pt#;\n";
+  for (int i = 0; i < 4; i++)
+    cout << "drawdot z" << i + 1 << ";\n";
+  cout << "path boogje;\n";
+#if 0
+  cout << "pickup pencircle scaled 0.4pt#;\n";
+  cout << "boogje=z1..controls z2 and z3..z4..controls z5 and z6..cycle;\n";
+  cout << "filldraw boogje;\n";
+#else
+  cout << "pickup pencircle scaled 1.6pt#;\n";
+  cout << "boogje=z1..controls z2 and z3..z4;\n";
+  cout << "draw boogje;\n";
+  cout << "pickup pencircle scaled 0.4pt#;\n";
+  cout << "boogje:=z4..controls z5 and z6..z1;\n";
+  cout << "draw boogje;\n";
+#endif
+  cout << "showit; shipit;clearit;\n";
+}
+
+void
+bow (Point* points, int n, int d)
+{
+  Array<Offset> notes;
+  for (int i = 0; i < n; i++)
+    notes.push (Offset (points[i].x, points[i].y));
+//  cout << "pickup pencircle scaled 8pt#;\n";
+  cout << "pickup pencircle scaled 2pt#;\n";
+  for (int i = 0; i < n; i++)
+    cout << "drawdot (" << notes[i].x () << ", " << notes[i].y () << ");\n";
+  Bezier_bow b (0);
+  b.set (notes, d);
+  b.calc ();
+  out (b);
+  return;
+}
+
+int
+main ()
+{
+  //cout.unsetf(ios::scientific);
+  cout.setf(ios::fixed);
+#if 0
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,30, 60,30, 80,0, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,10, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,40, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,40, 80,0, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, 1);
+  bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, -1);
+  bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,100 }, 6, -1);
+  bow ((Point[9]){ 0,0, 20,0, 40,-80, 60,0, 80,0, 100,0, 120,0, 140,0, 160,-1 }, 9, -1);
+  bow ((Point[9]){ 0,0, 40,0, 80,180, 120,0, 160,0, 200,0, 240,0, 280,0, 320,1 }, 9, 1);
+  bow ((Point[9]){ 
+  {0, 0}, 
+  {19.10645980317711, 1}, 
+  {29.402919606354207, 28}, 
+  {55.389379409531308, 1}, 
+  {73.530839212708514, 1}, 
+  {91.672299015885727, 1}, 
+  {111.35901367452229, 1}, 
+  {131.04572833315891, 1}, 
+  {145.76744299179552, 0}
+  }, 
+  9, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,40 }, 6, 1);
+  bow ((Point[2]){ 0,0, 20,0 }, 2, 1);
+  bow ((Point[2]){ 0,0, 20,-10 }, 2, 1);
+#endif
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,100 }, 6, 1);
+  cout << "\\end\n";
+  return 0;
+}
+
+// vim:sw=2 makeprg=g++\ -g\ bow.cc\ -o\ bow
+#include <iostream.h>
+#define PT
+
+// mmm
+#define STANDALONE
+
+#include <math.h>
+
+typedef void *Paper_def;
+
+#include "bezier.hh"
+#include "bezier.cc"
+#include "mat.hh"
+
+struct Point
+{
+  Real x, y;
+};
+
+void
+out (Bezier_bow& b)
+{
+  cout << "save dx,dy,x,y;\n";
+  for (int i = 0; i < 4; i++)
+      cout << "z" << i + 1 << " = (" << b.control_[i].x ()
+       << ", " << b.control_[i].y () << ");\n";
+  for (int i = 1; i < 3; i++)
+      cout << "z" << i + 4 << " = (" << b.return_[i].x ()
+       << ", " << b.return_[i].y () << ");\n";
+//  cout << "pickup pencircle scaled 0.5pt#;\n";
+//  cout << "draw z2--z3; draw (50,0)-- 0.5[z2,z3];\n";
+  cout << "pickup pencircle scaled 4pt#;\n";
+  for (int i = 0; i < 4; i++)
+    cout << "drawdot z" << i + 1 << ";\n";
+//  cout << "pickup pencircle scaled 0.4pt#;\n";
+  cout << "pickup pencircle scaled 1.6pt#;\n";
+  cout << "path boogje;\n";
+//  cout << "boogje=z1..controls z2 and z3..z4..controls z5 and z6..cycle;\n";
+  cout << "boogje=z1..controls z2 and z3..z4;\n";
+  cout << "dx=x4-x1;\n";
+  cout << "dy=y4-y1;\n";
+  cout << "draw boogje;\n";
+  cout << "pickup pencircle scaled 0.4pt#;\n";
+  cout << "boogje:=z4..controls z5 and z6..z1;\n";
+  cout << "draw boogje;\n";
+//  cout << "filldraw boogje;\n";
+  cout << "showit; shipit;clearit;\n";
+}
+
+void
+bow (Point* points, int n, int d)
+{
+  Array<Offset> notes;
+  for (int i = 0; i < n; i++)
+    notes.push (Offset (points[i].x, points[i].y));
+  cout << "pickup pencircle scaled 8pt#;\n";
+  for (int i = 0; i < n; i++)
+    cout << "drawdot (" << notes[i].x () << ", " << notes[i].y () << ");\n";
+  Bezier_bow b (0);
+  b.set (notes, d);
+  b.calc ();
+  out (b);
+  return;
+}
+
+int
+main ()
+{
+  //cout.unsetf(ios::scientific);
+  cout.setf(ios::fixed);
+#if 1
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,30, 60,30, 80,0, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,10, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,40, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,40, 80,0, 100,1 }, 6, 1);
+  bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, 1);
+  bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,50 }, 6, -1);
+  bow ((Point[6]){ 0,10, 20,20, 40,0, 60,40, 80,20, 100,100 }, 6, -1);
+  bow ((Point[9]){ 0,0, 20,0, 40,-80, 60,0, 80,0, 100,0, 120,0, 140,0, 160,-1 }, 9, -1);
+  bow ((Point[9]){ 0,0, 40,0, 80,180, 120,0, 160,0, 200,0, 240,0, 280,0, 320,1 }, 9, 1);
+  bow ((Point[9]){ 
+  {0, 0}, 
+  {19.10645980317711, 1}, 
+  {29.402919606354207, 28}, 
+  {55.389379409531308, 1}, 
+  {73.530839212708514, 1}, 
+  {91.672299015885727, 1}, 
+  {111.35901367452229, 1}, 
+  {131.04572833315891, 1}, 
+  {145.76744299179552, 0}
+  }, 
+  9, 1);
+#endif
+  bow ((Point[6]){ 0,0, 20,0, 40,0, 60,0, 80,0, 100,40 }, 6, 1);
+  cout << "\\end\n";
+  return 0;
+}
+
index 1616ccc9f3cc55346087ab70d01596c5cda1c1b5..b7ba27d28119305e1ac1d8201932fe0746a12fb7 100644 (file)
   \fi}
 
 \def\pianobrace#1{{\bracefont\char #1}}
-\def\staffbracket#1{{\bracketfont\char #1}}
+\def\staffbracket#1{{\centeralign{\bracketfont\char #1}}}
 
 \def\embeddedtex#1{}
 \def\embeddedps#1{}
index 2610706399a01815ef0b028cf06d015a9342266c..9ff22292d5a55c4b4e6e8a05168916dff2201ed3 100644 (file)
@@ -118,60 +118,21 @@ def
         }
         bind def
  staffheight 2 div /slurhtlimit exch def
- /slurratio 0.3333 def
- %
- %  (b*ratio)/(1 + b / htlimit)
- /getslurcontrol 
- { 
-        slurhtlimit 90 div /slur_alpha exch def
-        slurratio 60 div slur_alpha div  /slur_beta  exch def
-        slur_beta mul 1 atan slur_alpha mul
- } bind def
- staffrulethickness 1.5 mul  /slur_thick exch def
- /draw_slur
- {
-        staffrulethickness setlinewidth
-        0 0 moveto
-        /slur_dir exch def
-        /slur_height exch def
-        /slur_dy exch def
-        /slur_dx exch def
-        slur_dy slur_dx lily_distance /slur_b  exch def
-        slur_b getslurcontrol slur_height add
-        slur_dir mul /slur_ht exch def
-        slur_b getslurcontrol /slur_indent exch def       
-%
-        slur_dy slur_dx atan rotate
-        slur_indent slur_ht
-        slur_b slur_indent sub slur_ht
-        slur_b 0
-        rcurveto        
- %
-        slur_indent neg slur_ht slur_dir slur_thick mul  sub
-        slur_indent slur_b sub slur_ht slur_dir slur_thick mul  sub
-        slur_b neg  0
-        rcurveto
- %
-        gsave
-                fill
-        grestore
-        stroke
- } bind def
- /draw_control_slur
- {
-        staffrulethickness setlinewidth
-        0 0 moveto
-        rcurveto        
-        rcurveto
-        gsave
+/draw_slur
+{
+       staffrulethickness setlinewidth
+       0 0 moveto
+       rcurveto
+       rcurveto
+       gsave
        fill
-        grestore
-        stroke
- } bind def
+       grestore
+       stroke
      } bind def
 }}
 
-
 \def\turnOnExperimentalFeatures{%
 % draw a slur in embedded postscript
 \special{ps:
 }}
+