]> git.donarmstrong.com Git - lilypond.git/blobdiff - lily/pitch.cc
(process_lilypond_blocks): opps.
[lilypond.git] / lily / pitch.cc
index 09ebadf66012029478de41253975424c767e24c6..895f18ef6265fe5c80308d044134e12d533fe86e 100644 (file)
@@ -3,7 +3,7 @@
   
   source file of the GNU LilyPond music typesetter
   
-  (c) 1998--2002 Han-Wen Nienhuys <hanwen@cs.uu.nl>
+  (c) 1998--2003 Han-Wen Nienhuys <hanwen@cs.uu.nl>
   
  */
 #include "pitch.hh"
@@ -18,15 +18,6 @@ Pitch::Pitch (int o, int n, int a)
   notename_ = n;
   alteration_ = a;
   octave_ = o;
-
-  if (n < 0 || n >= 7 ||
-      a < -2 || a > 2)
-    {
-      String s = _ ("Pitch arguments out of range");
-      s += ": alteration = " + to_string (a);
-      s += ", notename = " + to_string (n);
-      warning (s);
-    }
   normalise ();
 }
 
@@ -128,18 +119,25 @@ Pitch::normalise ()
 void
 Pitch::transpose (Pitch delta)
 {
-  int old_semi = semitone_pitch ();
-  int delta_semi = delta.semitone_pitch ();
+  int new_semi = semitone_pitch ()  +delta.semitone_pitch();
   octave_ += delta.octave_;
   notename_ += delta.notename_;
-
-  int new_semi = semitone_pitch ();
-  int delta_acc = new_semi - old_semi - delta_semi;
-  alteration_ -= delta_acc;
+  alteration_ += new_semi - semitone_pitch();
 
   normalise ();
 }
 
+Pitch
+interval (Pitch const & from , Pitch const & to )
+{
+  int sound = to.semitone_pitch()  - from.semitone_pitch ();
+  Pitch pt (to.get_octave () - from.get_octave (),
+           to.get_notename() - from.get_notename(),
+           to.get_alteration() - from.get_alteration());
+
+  return pt.transposed (Pitch(0,0,sound - pt.semitone_pitch()));
+}
+
 
 /* FIXME
    Merge with *pitch->text* funcs in chord-name.scm
@@ -147,10 +145,10 @@ Pitch::transpose (Pitch delta)
 char const *accname[] = {"eses", "es", "", "is" , "isis"};
 
 String
-Pitch::string () const
+Pitch::to_string () const
 {
   int n = (notename_ + 2) % 7;
-  String s = to_string (char (n + 'a'));
+  String s = ::to_string (char (n + 'a'));
   if (alteration_)
     s += String (accname[alteration_ + 2]);
 
@@ -164,7 +162,7 @@ Pitch::string () const
     {
       int o = (-octave_) - 1;
       while (o--)
-       s += to_string (',');
+       s += ::to_string (',');
     }
 
   return s;
@@ -175,7 +173,7 @@ Pitch::string () const
   return copy of resulting pitch
  */
 Pitch
-Pitch::to_relative_octave (Pitch p)
+Pitch::to_relative_octave (Pitch p) const
 {
   int oct_mod = octave_  + 1;  // account for c' = octave 1 iso. 0 4
   Pitch up_pitch (p);
@@ -195,9 +193,7 @@ Pitch::to_relative_octave (Pitch p)
     n = down_pitch;
   
   n.octave_ += oct_mod;
-
-  *this = n;
-  return *this;
+  return n;
 }
 
 void
@@ -221,26 +217,23 @@ Pitch::down_to (int notename)
 }
  
 LY_DEFINE(ly_pitch_transpose,
-         "ly-transpose-pitch", 2, 0, 0,
+         "ly:pitch-transpose", 2, 0, 0,
          (SCM p, SCM delta),
-         "Transpose @var{p} by the amount @var{delta}, where @var{delta} is the
-pitch that central C is transposed to.
-")
+         "Transpose @var{p} by the amount @var{delta}, where @var{delta} is the "
+" pitch that central C is transposed to.")
 {
   Pitch* t = unsmob_pitch (p);
   Pitch *d = unsmob_pitch (delta);
   SCM_ASSERT_TYPE(t, p, SCM_ARG1, __FUNCTION__, "pitch")  ;
   SCM_ASSERT_TYPE(d, delta, SCM_ARG1, __FUNCTION__, "pitch")  ;
 
-  Pitch tp =*t;
-  tp.transpose (*d);
-  return tp.smobbed_copy ();
+  return t->transposed (*d).smobbed_copy ();
 }
 
 /****************************************************************/
 
 
-IMPLEMENT_TYPE_P (Pitch, "pitch?");
+IMPLEMENT_TYPE_P (Pitch, "ly:pitch?");
 
 SCM
 Pitch::mark_smob (SCM)
@@ -255,7 +248,7 @@ Pitch::print_smob (SCM s, SCM port, scm_print_state *)
   Pitch  *r = (Pitch *) ly_cdr (s);
      
   scm_puts ("#<Pitch ", port);
-  scm_display (scm_makfrom0str (r->string ().to_str0 ()), port);
+  scm_display (scm_makfrom0str (r->to_string ().to_str0 ()), port);
   scm_puts (" >", port);
   
   return 1;
@@ -291,15 +284,12 @@ Pitch::less_p (SCM p1, SCM p2)
   should add optional args
  */
 
-LY_DEFINE(make_pitch, "make-pitch", 3, 0, 0, 
+LY_DEFINE(make_pitch, "ly:make-pitch", 3, 0, 0, 
          (SCM o, SCM n, SCM a),
-         "
-@var{octave} is specified by an integer, zero for the octave containing
-middle C.  @var{note} is a number from 0 to 6, with 0 corresponding to C
-and 6 corresponding to B.  The shift is zero for a natural, negative for
-flats, or positive for sharps.
-
-")
+         "@var{octave} is specified by an integer, zero for the octave containing "
+         "middle C.  @var{note} is a number from 0 to 6, with 0 corresponding to C "
+         "and 6 corresponding to B.  The shift is zero for a natural, negative for "
+         "flats, or positive for sharps. ")
 {
   SCM_ASSERT_TYPE(gh_number_p (o), o, SCM_ARG1, __FUNCTION__, "number");
   SCM_ASSERT_TYPE(gh_number_p (n), n, SCM_ARG2, __FUNCTION__, "number");
@@ -309,19 +299,28 @@ flats, or positive for sharps.
   return p.smobbed_copy ();
 }
 
+LY_DEFINE(pitch_steps, "ly:pitch-steps", 1, 0,0,
+         (SCM p),
+         "Number of steps counted from central C of the pitch @var{p}.")
+{
+  Pitch *pp = unsmob_pitch (p);
+  SCM_ASSERT_TYPE(pp, p, SCM_ARG1, __FUNCTION__, "Pitch");
+
+  return gh_int2scm (pp->steps());
+}
 
-LY_DEFINE(pitch_octave, "pitch-octave", 1, 0, 0, 
+LY_DEFINE(pitch_octave, "ly:pitch-octave", 1, 0, 0, 
          (SCM pp),
          "extract the octave from pitch @var{p}.")
 {
   Pitch *p = unsmob_pitch (pp);
-   SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
+  SCM_ASSERT_TYPE(p, pp, SCM_ARG1, __FUNCTION__, "Pitch");
   int q = p->get_octave ();
 
   return gh_int2scm (q);
 }
 
-LY_DEFINE(pitch_alteration, "pitch-alteration", 1, 0, 0, 
+LY_DEFINE(pitch_alteration, "ly:pitch-alteration", 1, 0, 0, 
          (SCM pp),
          "extract the alteration from pitch  @var{p}.")
 {
@@ -332,7 +331,7 @@ LY_DEFINE(pitch_alteration, "pitch-alteration", 1, 0, 0,
   return gh_int2scm (q);
 }
 
-LY_DEFINE(pitch_notename, "pitch-notename", 1, 0, 0, 
+LY_DEFINE(pitch_notename, "ly:pitch-notename", 1, 0, 0, 
          (SCM pp),
          "extract the note name from pitch  @var{pp}.")
 {
@@ -343,7 +342,7 @@ LY_DEFINE(pitch_notename, "pitch-notename", 1, 0, 0,
   return gh_int2scm (q);
 }
 
-LY_DEFINE(pitch_semitones,  "pitch-semitones", 1, 0, 0, 
+LY_DEFINE(pitch_semitones,  "ly:pitch-semitones", 1, 0, 0, 
          (SCM pp),
          "calculate the number of semitones of @var{p} from central C.")
 {
@@ -352,22 +351,41 @@ LY_DEFINE(pitch_semitones,  "pitch-semitones", 1, 0, 0,
  
   int q = p->semitone_pitch ();
   
-  // Was :
-  //
-  //int q = p->steps ();
-  //
-  // As the function is called "pitch_semitones", I assume it was a mistake !
-  // Jiba
-
   return gh_int2scm (q);
 }
 
-LY_DEFINE(pitch_less, "pitch<?", 2,0,0, (SCM p1, SCM p2),
+LY_DEFINE(pitch_less, "ly:pitch<?", 2,0,0, (SCM p1, SCM p2),
          "Is @var{p1} lower than @var{p2}? This uses lexicographic ordening.")
 {
-  return Pitch::less_p (ly_car (p1),  ly_car (p2));
+  Pitch *a = unsmob_pitch (p1);
+  Pitch *b = unsmob_pitch (p2);
+  
+  SCM_ASSERT_TYPE(a, p1, SCM_ARG1, __FUNCTION__, "Pitch");
+  SCM_ASSERT_TYPE(b, p2, SCM_ARG2, __FUNCTION__, "Pitch");
+
+  if (Pitch::compare (*a, *b) < 0)
+    return SCM_BOOL_T;
+  else
+    return SCM_BOOL_F;
+}
+
+LY_DEFINE(ly_pitch_diff, "ly:pitch-diff", 2 ,0 ,0,
+         (SCM pitch, SCM  root),
+         "Return pitch with value DELTA =  PITCH - ROOT, ie, "
+"ROOT == (ly:pitch-transpose root delta).")
+{
+  Pitch *p = unsmob_pitch (pitch);
+  Pitch *r = unsmob_pitch (root);
+  SCM_ASSERT_TYPE(p, pitch, SCM_ARG1, __FUNCTION__, "Pitch");
+  SCM_ASSERT_TYPE(r, root, SCM_ARG2, __FUNCTION__, "Pitch");
+
+  return interval (*r,  *p).smobbed_copy();
 }
 
+         
+
+
+
 SCM
 Pitch::smobbed_copy ()const
 {
@@ -393,3 +411,10 @@ Pitch::get_alteration () const
   return alteration_;
 }
 
+Pitch
+Pitch::transposed (Pitch d) const
+{
+  Pitch p =*this;
+  p.transpose (d);
+  return p;
+}